From aad840da59a8ec257ffc70869e735e8e5c287573 Mon Sep 17 00:00:00 2001 From: makeavish Date: Fri, 23 Feb 2024 14:08:17 +0530 Subject: [PATCH 01/68] chore: send language and service name events as list --- pkg/query-service/telemetry/telemetry.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/pkg/query-service/telemetry/telemetry.go b/pkg/query-service/telemetry/telemetry.go index ea93d75a0a5b..939d0cd39b03 100644 --- a/pkg/query-service/telemetry/telemetry.go +++ b/pkg/query-service/telemetry/telemetry.go @@ -228,14 +228,20 @@ func createTelemetry() { telemetry.SendEvent(TELEMETRY_EVENT_ENVIRONMENT, map[string]interface{}{"value": tagsInfo.Env}, "") } - for language, _ := range tagsInfo.Languages { - telemetry.SendEvent(TELEMETRY_EVENT_LANGUAGE, map[string]interface{}{"language": language}, "") + languages := []string{} + for language := range tagsInfo.Languages { + languages = append(languages, language) } - - for service, _ := range tagsInfo.Services { - telemetry.SendEvent(TELEMETRY_EVENT_SERVICE, map[string]interface{}{"serviceName": service}, "") + if len(languages) > 0 { + telemetry.SendEvent(TELEMETRY_EVENT_LANGUAGE, map[string]interface{}{"language": languages}, "") + } + services := []string{} + for service := range tagsInfo.Services { + services = append(services, service) + } + if len(services) > 0 { + telemetry.SendEvent(TELEMETRY_EVENT_SERVICE, map[string]interface{}{"serviceName": services}, "") } - totalSpans, _ := telemetry.reader.GetTotalSpans(context.Background()) totalLogs, _ := telemetry.reader.GetTotalLogs(context.Background()) spansInLastHeartBeatInterval, _ := telemetry.reader.GetSpansInLastHeartBeatInterval(context.Background(), HEART_BEAT_DURATION) From 5959963b9d643ea39b8a5a1e5c264d9a5b14c923 Mon Sep 17 00:00:00 2001 From: Vikrant Gupta Date: Thu, 28 Mar 2024 16:34:09 +0530 Subject: [PATCH 02/68] fix: [SIG-575]: no data in new trace explorer page specific scenario (#4748) Co-authored-by: Vishal Sharma --- .../src/container/OptionsMenu/constants.ts | 45 +++++++++++++++++++ .../container/OptionsMenu/useOptionsMenu.ts | 25 ++++++++--- 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/frontend/src/container/OptionsMenu/constants.ts b/frontend/src/container/OptionsMenu/constants.ts index b1e54636865a..2db02f85b8de 100644 --- a/frontend/src/container/OptionsMenu/constants.ts +++ b/frontend/src/container/OptionsMenu/constants.ts @@ -1,3 +1,5 @@ +import { DataTypes } from 'types/api/queryBuilder/queryAutocompleteResponse'; + import { OptionsQuery } from './types'; export const URL_OPTIONS = 'options'; @@ -7,3 +9,46 @@ export const defaultOptionsQuery: OptionsQuery = { maxLines: 2, format: 'list', }; + +export const defaultTraceSelectedColumns = [ + { + key: 'serviceName', + dataType: DataTypes.String, + type: 'tag', + isColumn: true, + isJSON: false, + id: 'serviceName--string--tag--true', + }, + { + key: 'name', + dataType: DataTypes.String, + type: 'tag', + isColumn: true, + isJSON: false, + id: 'name--string--tag--true', + }, + { + key: 'durationNano', + dataType: DataTypes.Float64, + type: 'tag', + isColumn: true, + isJSON: false, + id: 'durationNano--float64--tag--true', + }, + { + key: 'httpMethod', + dataType: DataTypes.String, + type: 'tag', + isColumn: true, + isJSON: false, + id: 'httpMethod--string--tag--true', + }, + { + key: 'responseStatusCode', + dataType: DataTypes.String, + type: 'tag', + isColumn: true, + isJSON: false, + id: 'responseStatusCode--string--tag--true', + }, +]; diff --git a/frontend/src/container/OptionsMenu/useOptionsMenu.ts b/frontend/src/container/OptionsMenu/useOptionsMenu.ts index be2ae00b3703..97fbbbb00666 100644 --- a/frontend/src/container/OptionsMenu/useOptionsMenu.ts +++ b/frontend/src/container/OptionsMenu/useOptionsMenu.ts @@ -16,7 +16,11 @@ import { } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { DataSource } from 'types/common/queryBuilder'; -import { defaultOptionsQuery, URL_OPTIONS } from './constants'; +import { + defaultOptionsQuery, + defaultTraceSelectedColumns, + URL_OPTIONS, +} from './constants'; import { InitialOptions, OptionsMenuConfig, OptionsQuery } from './types'; import { getOptionsFromKeys } from './utils'; @@ -124,20 +128,29 @@ const useOptionsMenu = ({ { queryKey: [debouncedSearchText, isFocused], enabled: isFocused }, ); - const searchedAttributeKeys = useMemo( - () => searchedAttributesData?.payload?.attributeKeys || [], - [searchedAttributesData?.payload?.attributeKeys], - ); + const searchedAttributeKeys = useMemo(() => { + if (searchedAttributesData?.payload?.attributeKeys?.length) { + return searchedAttributesData.payload.attributeKeys; + } + if (dataSource === DataSource.TRACES) { + return defaultTraceSelectedColumns; + } + + return []; + }, [dataSource, searchedAttributesData?.payload?.attributeKeys]); const initialOptionsQuery: OptionsQuery = useMemo( () => ({ ...defaultOptionsQuery, ...initialOptions, + // eslint-disable-next-line no-nested-ternary selectColumns: initialOptions?.selectColumns ? initialSelectedColumns + : dataSource === DataSource.TRACES + ? defaultTraceSelectedColumns : defaultOptionsQuery.selectColumns, }), - [initialOptions, initialSelectedColumns], + [dataSource, initialOptions, initialSelectedColumns], ); const selectedColumnKeys = useMemo( From e25b54f86abe872984d094ad5017c05bacf92747 Mon Sep 17 00:00:00 2001 From: Vikrant Gupta Date: Thu, 28 Mar 2024 16:46:16 +0530 Subject: [PATCH 03/68] fix: 404 resource not found issues (#4757) --- frontend/src/api/SAML/listAllDomain.ts | 2 +- frontend/src/api/queryBuilder/getAggregateAttribute.ts | 2 +- frontend/src/api/queryBuilder/getAttributeKeys.ts | 2 +- frontend/src/api/saveView/deleteView.ts | 2 +- frontend/src/api/saveView/getAllViews.ts | 2 +- frontend/src/api/saveView/saveView.ts | 2 +- frontend/src/api/saveView/updateView.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/src/api/SAML/listAllDomain.ts b/frontend/src/api/SAML/listAllDomain.ts index dea73e4311e6..41620f7d3e50 100644 --- a/frontend/src/api/SAML/listAllDomain.ts +++ b/frontend/src/api/SAML/listAllDomain.ts @@ -8,7 +8,7 @@ const listAllDomain = async ( props: Props, ): Promise | ErrorResponse> => { try { - const response = await axios.get(`orgs/${props.orgId}/domains`); + const response = await axios.get(`/orgs/${props.orgId}/domains`); return { statusCode: 200, diff --git a/frontend/src/api/queryBuilder/getAggregateAttribute.ts b/frontend/src/api/queryBuilder/getAggregateAttribute.ts index e493bb460ae9..f13c3da4a891 100644 --- a/frontend/src/api/queryBuilder/getAggregateAttribute.ts +++ b/frontend/src/api/queryBuilder/getAggregateAttribute.ts @@ -24,7 +24,7 @@ export const getAggregateAttribute = async ({ const response: AxiosResponse<{ data: IQueryAutocompleteResponse; }> = await ApiV3Instance.get( - `autocomplete/aggregate_attributes?${createQueryParams({ + `/autocomplete/aggregate_attributes?${createQueryParams({ aggregateOperator, searchText, dataSource, diff --git a/frontend/src/api/queryBuilder/getAttributeKeys.ts b/frontend/src/api/queryBuilder/getAttributeKeys.ts index 99edc630c825..9cc127bb716e 100644 --- a/frontend/src/api/queryBuilder/getAttributeKeys.ts +++ b/frontend/src/api/queryBuilder/getAttributeKeys.ts @@ -25,7 +25,7 @@ export const getAggregateKeys = async ({ const response: AxiosResponse<{ data: IQueryAutocompleteResponse; }> = await ApiV3Instance.get( - `autocomplete/attribute_keys?${createQueryParams({ + `/autocomplete/attribute_keys?${createQueryParams({ aggregateOperator, searchText, dataSource, diff --git a/frontend/src/api/saveView/deleteView.ts b/frontend/src/api/saveView/deleteView.ts index e58e731d10a6..9317c8331ab9 100644 --- a/frontend/src/api/saveView/deleteView.ts +++ b/frontend/src/api/saveView/deleteView.ts @@ -2,4 +2,4 @@ import axios from 'api'; import { DeleteViewPayloadProps } from 'types/api/saveViews/types'; export const deleteView = (uuid: string): Promise => - axios.delete(`explorer/views/${uuid}`); + axios.delete(`/explorer/views/${uuid}`); diff --git a/frontend/src/api/saveView/getAllViews.ts b/frontend/src/api/saveView/getAllViews.ts index bdafb96b610b..4a54d6af0df4 100644 --- a/frontend/src/api/saveView/getAllViews.ts +++ b/frontend/src/api/saveView/getAllViews.ts @@ -6,4 +6,4 @@ import { DataSource } from 'types/common/queryBuilder'; export const getAllViews = ( sourcepage: DataSource, ): Promise> => - axios.get(`explorer/views?sourcePage=${sourcepage}`); + axios.get(`/explorer/views?sourcePage=${sourcepage}`); diff --git a/frontend/src/api/saveView/saveView.ts b/frontend/src/api/saveView/saveView.ts index a0c7ba5bf42a..60a552f0bb24 100644 --- a/frontend/src/api/saveView/saveView.ts +++ b/frontend/src/api/saveView/saveView.ts @@ -8,7 +8,7 @@ export const saveView = ({ viewName, extraData, }: SaveViewProps): Promise> => - axios.post('explorer/views', { + axios.post('/explorer/views', { name: viewName, sourcePage, compositeQuery, diff --git a/frontend/src/api/saveView/updateView.ts b/frontend/src/api/saveView/updateView.ts index 6ee745ffc2e7..b48b73f275a6 100644 --- a/frontend/src/api/saveView/updateView.ts +++ b/frontend/src/api/saveView/updateView.ts @@ -11,7 +11,7 @@ export const updateView = ({ sourcePage, viewKey, }: UpdateViewProps): Promise => - axios.put(`explorer/views/${viewKey}`, { + axios.put(`/explorer/views/${viewKey}`, { name: viewName, compositeQuery, extraData, From 6014bb76b6e80707a4a6dc6ff22094966330ca02 Mon Sep 17 00:00:00 2001 From: Yunus M Date: Thu, 28 Mar 2024 16:51:29 +0530 Subject: [PATCH 04/68] feat: support drag select in chart - alerts page (#4618) * feat: support drag select in chart - alerts page * feat: handle back navigation after drag select --- .../FormAlertRules/ChartPreview/index.tsx | 62 ++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/frontend/src/container/FormAlertRules/ChartPreview/index.tsx b/frontend/src/container/FormAlertRules/ChartPreview/index.tsx index 59dd78e96ba9..6e8c167c2992 100644 --- a/frontend/src/container/FormAlertRules/ChartPreview/index.tsx +++ b/frontend/src/container/FormAlertRules/ChartPreview/index.tsx @@ -1,6 +1,7 @@ import { InfoCircleOutlined } from '@ant-design/icons'; import Spinner from 'components/Spinner'; import { DEFAULT_ENTITY_VERSION } from 'constants/app'; +import { QueryParams } from 'constants/query'; import { initialQueriesMap, PANEL_TYPES } from 'constants/queryBuilder'; import GridPanelSwitch from 'container/GridPanelSwitch'; import { getFormatNameByOptionId } from 'container/NewWidget/RightContainer/alertFomatCategories'; @@ -10,11 +11,17 @@ import { Time as TimeV2 } from 'container/TopNav/DateTimeSelectionV2/config'; import { useGetQueryRange } from 'hooks/queryBuilder/useGetQueryRange'; import { useIsDarkMode } from 'hooks/useDarkMode'; import { useResizeObserver } from 'hooks/useDimensions'; +import useUrlQuery from 'hooks/useUrlQuery'; +import GetMinMax from 'lib/getMinMax'; +import getTimeString from 'lib/getTimeString'; +import history from 'lib/history'; import { getUPlotChartOptions } from 'lib/uPlotLib/getUplotChartOptions'; import { getUPlotChartData } from 'lib/uPlotLib/utils/getUplotChartData'; -import { useEffect, useMemo, useRef, useState } from 'react'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { useSelector } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; +import { useLocation } from 'react-router-dom'; +import { UpdateTimeInterval } from 'store/actions'; import { AppState } from 'store/reducers'; import { AlertDef } from 'types/api/alerts/def'; import { Query } from 'types/api/queryBuilder/queryBuilderData'; @@ -54,6 +61,7 @@ function ChartPreview({ yAxisUnit, }: ChartPreviewProps): JSX.Element | null { const { t } = useTranslation('alerts'); + const dispatch = useDispatch(); const threshold = alertDef?.condition.target || 0; const [minTimeScale, setMinTimeScale] = useState(); const [maxTimeScale, setMaxTimeScale] = useState(); @@ -63,6 +71,30 @@ function ChartPreview({ GlobalReducer >((state) => state.globalTime); + const handleBackNavigation = (): void => { + const searchParams = new URLSearchParams(window.location.search); + const startTime = searchParams.get(QueryParams.startTime); + const endTime = searchParams.get(QueryParams.endTime); + + if (startTime && endTime && startTime !== endTime) { + dispatch( + UpdateTimeInterval('custom', [ + parseInt(getTimeString(startTime), 10), + parseInt(getTimeString(endTime), 10), + ]), + ); + } + }; + + useEffect(() => { + window.addEventListener('popstate', handleBackNavigation); + + return (): void => { + window.removeEventListener('popstate', handleBackNavigation); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + const canQuery = useMemo((): boolean => { if (!query || query == null) { return false; @@ -131,10 +163,34 @@ function ChartPreview({ const containerDimensions = useResizeObserver(graphRef); const isDarkMode = useIsDarkMode(); + const urlQuery = useUrlQuery(); + const location = useLocation(); const optionName = getFormatNameByOptionId(alertDef?.condition.targetUnit || '') || ''; + const onDragSelect = useCallback( + (start: number, end: number): void => { + const startTimestamp = Math.trunc(start); + const endTimestamp = Math.trunc(end); + + if (startTimestamp !== endTimestamp) { + dispatch(UpdateTimeInterval('custom', [startTimestamp, endTimestamp])); + } + + const { maxTime, minTime } = GetMinMax('custom', [ + startTimestamp, + endTimestamp, + ]); + + urlQuery.set(QueryParams.startTime, minTime.toString()); + urlQuery.set(QueryParams.endTime, maxTime.toString()); + const generatedUrl = `${location.pathname}?${urlQuery.toString()}`; + history.push(generatedUrl); + }, + [dispatch, location.pathname, urlQuery], + ); + const options = useMemo( () => getUPlotChartOptions({ @@ -145,6 +201,7 @@ function ChartPreview({ minTimeScale, maxTimeScale, isDarkMode, + onDragSelect, thresholds: [ { index: '0', // no impact @@ -174,6 +231,7 @@ function ChartPreview({ minTimeScale, maxTimeScale, isDarkMode, + onDragSelect, threshold, t, optionName, From 9f30bba9a8e50f2403a2f7503f29bd2b01f172f7 Mon Sep 17 00:00:00 2001 From: Yunus M Date: Thu, 28 Mar 2024 16:55:59 +0530 Subject: [PATCH 05/68] feat: add support to pin attributes in logs details view (#4692) * feat: add support to pin attributes in logs details view * feat: add safety checks * feat: update styles * feat: update styles * feat: move json parsing in try catch block --- frontend/src/constants/localStorage.ts | 1 + .../LogDetailedView/Overview.styles.scss | 13 +++ .../LogDetailedView/TableView.styles.scss | 37 ++++++- .../container/LogDetailedView/TableView.tsx | 101 +++++++++++++++++- .../ResourceAttributesFilter.styles.scss | 13 +++ .../ResourceAttributesFilter/styles.ts | 1 - 6 files changed, 158 insertions(+), 8 deletions(-) diff --git a/frontend/src/constants/localStorage.ts b/frontend/src/constants/localStorage.ts index 0ba6cac30212..85f46ab8924c 100644 --- a/frontend/src/constants/localStorage.ts +++ b/frontend/src/constants/localStorage.ts @@ -17,4 +17,5 @@ export enum LOCALSTORAGE { IS_IDENTIFIED_USER = 'IS_IDENTIFIED_USER', DASHBOARD_VARIABLES = 'DASHBOARD_VARIABLES', SHOW_EXPLORER_TOOLBAR = 'SHOW_EXPLORER_TOOLBAR', + PINNED_ATTRIBUTES = 'PINNED_ATTRIBUTES', } diff --git a/frontend/src/container/LogDetailedView/Overview.styles.scss b/frontend/src/container/LogDetailedView/Overview.styles.scss index bc63db442c4e..8e1726a0a9f5 100644 --- a/frontend/src/container/LogDetailedView/Overview.styles.scss +++ b/frontend/src/container/LogDetailedView/Overview.styles.scss @@ -53,6 +53,19 @@ background: rgba(171, 189, 255, 0.04); padding: 8px; + + .ant-collapse-extra { + display: flex; + align-items: center; + + .action-btn { + display: flex; + + .ant-btn { + background: rgba(113, 144, 249, 0.08); + } + } + } } .ant-collapse-content { diff --git a/frontend/src/container/LogDetailedView/TableView.styles.scss b/frontend/src/container/LogDetailedView/TableView.styles.scss index 89101bf7b2dc..d9cbdcabbb5b 100644 --- a/frontend/src/container/LogDetailedView/TableView.styles.scss +++ b/frontend/src/container/LogDetailedView/TableView.styles.scss @@ -5,12 +5,13 @@ .ant-table-row:hover { .ant-table-cell { .value-field { - display: flex; - justify-content: space-between; - align-items: center; .action-btn { display: flex; - gap: 4px; + position: absolute; + top: 50%; + right: 16px; + transform: translateY(-50%); + gap: 8px; } } } @@ -28,6 +29,30 @@ } } + .attribute-pin { + cursor: pointer; + + padding: 0; + vertical-align: middle; + text-align: center; + + .log-attribute-pin { + padding: 8px; + + display: flex; + justify-content: center; + align-items: center; + + .pin-attribute-icon { + border: none; + + &.pinned svg { + fill: var(--bg-robin-500); + } + } + } + } + .value-field-container { background: rgba(22, 25, 34, 0.4); @@ -70,6 +95,10 @@ .value-field-container { background: var(--bg-vanilla-300); + &.attribute-pin { + background: var(--bg-vanilla-100); + } + .action-btn { .filter-btn { background: var(--bg-vanilla-300); diff --git a/frontend/src/container/LogDetailedView/TableView.tsx b/frontend/src/container/LogDetailedView/TableView.tsx index 593519404de4..a69fba644165 100644 --- a/frontend/src/container/LogDetailedView/TableView.tsx +++ b/frontend/src/container/LogDetailedView/TableView.tsx @@ -1,22 +1,29 @@ +/* eslint-disable jsx-a11y/no-static-element-interactions */ +/* eslint-disable jsx-a11y/click-events-have-key-events */ import './TableView.styles.scss'; import { LinkOutlined } from '@ant-design/icons'; import { Color } from '@signozhq/design-tokens'; import { Button, Space, Spin, Tooltip, Tree, Typography } from 'antd'; import { ColumnsType } from 'antd/es/table'; +import getLocalStorageApi from 'api/browser/localstorage/get'; +import setLocalStorageApi from 'api/browser/localstorage/set'; +import cx from 'classnames'; import AddToQueryHOC, { AddToQueryHOCProps, } from 'components/Logs/AddToQueryHOC'; import CopyClipboardHOC from 'components/Logs/CopyClipboardHOC'; import { ResizeTable } from 'components/ResizeTable'; +import { LOCALSTORAGE } from 'constants/localStorage'; import { OPERATORS } from 'constants/queryBuilder'; import ROUTES from 'constants/routes'; +import { useIsDarkMode } from 'hooks/useDarkMode'; import history from 'lib/history'; import { fieldSearchFilter } from 'lib/logs/fieldSearch'; import { removeJSONStringifyQuotes } from 'lib/removeJSONStringifyQuotes'; import { isEmpty } from 'lodash-es'; -import { ArrowDownToDot, ArrowUpFromDot } from 'lucide-react'; -import { useMemo, useState } from 'react'; +import { ArrowDownToDot, ArrowUpFromDot, Pin } from 'lucide-react'; +import { useEffect, useMemo, useState } from 'react'; import { useDispatch } from 'react-redux'; import { generatePath } from 'react-router-dom'; import { Dispatch } from 'redux'; @@ -57,6 +64,28 @@ function TableView({ const dispatch = useDispatch>(); const [isfilterInLoading, setIsFilterInLoading] = useState(false); const [isfilterOutLoading, setIsFilterOutLoading] = useState(false); + const isDarkMode = useIsDarkMode(); + + const [pinnedAttributes, setPinnedAttributes] = useState< + Record + >({}); + + useEffect(() => { + const pinnedAttributesFromLocalStorage = getLocalStorageApi( + LOCALSTORAGE.PINNED_ATTRIBUTES, + ); + + if (pinnedAttributesFromLocalStorage) { + try { + const parsedPinnedAttributes = JSON.parse(pinnedAttributesFromLocalStorage); + setPinnedAttributes(parsedPinnedAttributes); + } catch (e) { + console.error('Error parsing pinned attributes from local storgage'); + } + } else { + setPinnedAttributes({}); + } + }, []); const flattenLogData: Record | null = useMemo( () => (logData ? flattenObject(logData) : null), @@ -74,6 +103,19 @@ function TableView({ } }; + const togglePinAttribute = (record: DataType): void => { + if (record) { + const newPinnedAttributes = { ...pinnedAttributes }; + newPinnedAttributes[record.key] = !newPinnedAttributes[record.key]; + setPinnedAttributes(newPinnedAttributes); + + setLocalStorageApi( + LOCALSTORAGE.PINNED_ATTRIBUTES, + JSON.stringify(newPinnedAttributes), + ); + } + }; + const onClickHandler = ( operator: string, fieldKey: string, @@ -138,6 +180,37 @@ function TableView({ } const columns: ColumnsType = [ + { + title: '', + dataIndex: 'pin', + key: 'pin', + width: 5, + align: 'left', + className: 'attribute-pin value-field-container', + render: (fieldData: Record, record): JSX.Element => { + let pinColor = isDarkMode ? Color.BG_VANILLA_100 : Color.BG_INK_500; + + if (pinnedAttributes[record?.key]) { + pinColor = Color.BG_ROBIN_500; + } + + return ( +
+
{ + togglePinAttribute(record); + }} + > + +
+
+ ); + }, + }, { title: 'Field', dataIndex: 'field', @@ -264,12 +337,34 @@ function TableView({ }, }, ]; + function sortPinnedAttributes( + data: Record[], + sortingObj: Record, + ): Record[] { + const sortingKeys = Object.keys(sortingObj); + return data.sort((a, b) => { + const aKey = a.key; + const bKey = b.key; + const aSortIndex = sortingKeys.indexOf(aKey); + const bSortIndex = sortingKeys.indexOf(bKey); + + if (sortingObj[aKey] && !sortingObj[bKey]) { + return -1; + } + if (!sortingObj[aKey] && sortingObj[bKey]) { + return 1; + } + return aSortIndex - bSortIndex; + }); + } + + const sortedAttributes = sortPinnedAttributes(dataSource, pinnedAttributes); return ( Date: Thu, 28 Mar 2024 16:58:35 +0530 Subject: [PATCH 06/68] fix: update devtool property to eval-source-map (#4760) --- frontend/webpack.config.js | 2 +- frontend/webpack.config.prod.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/webpack.config.js b/frontend/webpack.config.js index 65883594bb35..9a9bd39807b6 100644 --- a/frontend/webpack.config.js +++ b/frontend/webpack.config.js @@ -64,7 +64,7 @@ if (process.env.BUNDLE_ANALYSER === 'true') { */ const config = { mode: 'development', - devtool: 'source-map', + devtool: 'eval-source-map', entry: resolve(__dirname, './src/index.tsx'), devServer: { historyApiFallback: { diff --git a/frontend/webpack.config.prod.js b/frontend/webpack.config.prod.js index cf5816f24d91..22e33d79769b 100644 --- a/frontend/webpack.config.prod.js +++ b/frontend/webpack.config.prod.js @@ -79,7 +79,7 @@ if (process.env.BUNDLE_ANALYSER === 'true') { const config = { mode: 'production', - devtool: 'source-map', + devtool: 'eval-source-map', entry: resolve(__dirname, './src/index.tsx'), output: { path: resolve(__dirname, './build'), From 990fc83269cda3ec16b0ec763c62a5b31a1a46af Mon Sep 17 00:00:00 2001 From: Raj Kamal Singh <1133322+raj-k-singh@users.noreply.github.com> Date: Thu, 28 Mar 2024 19:57:07 +0530 Subject: [PATCH 07/68] Feat/integrations v0 mongo and nginx (#4763) * feat: flesh out pre-requisites for collecting mongodb logs and metrics * chore: remove stale pipelines in bundled integrations * chore: clean up 'collect metrics' step for mongodb * feat: add instructions for collecting and parsing mongodb logs * feat: add metrics and logs attributes to mongodb data collected list * feat: nginx logs collection instructions and some other cleanup * feat: add list of parsed log attributes to data collected list for nginx * chore: do not run pipeline population integration test if no built-in integration has a pipeline --- .../mongo/assets/pipelines/log-parser.json | 33 --- .../mongo/config/collect-logs.md | 117 +++++++++ ...e-otel-collector.md => collect-metrics.md} | 62 +++-- .../mongo/config/prerequisites.md | 53 ++-- .../mongo/integration.json | 226 +++++++++++++++--- .../builtin_integrations/mongo/overview.md | 5 +- .../nginx/assets/pipelines/log-parser.json | 62 ----- .../nginx/config/collect-logs.md | 139 +++++++++++ .../nginx/config/configure-otel-collector.md | 1 - .../nginx/config/prepare-nginx.md | 1 - .../nginx/config/prerequisites.md | 19 ++ .../nginx/integration.json | 77 +++--- .../builtin_integrations/nginx/overview.md | 2 +- .../postgres/config/collect-logs.md | 2 +- .../redis/assets/pipelines/log-parser.json | 33 --- .../redis/config/collect-logs.md | 2 +- .../redis/integration.json | 4 +- .../integration/signoz_integrations_test.go | 7 +- 18 files changed, 617 insertions(+), 228 deletions(-) delete mode 100644 pkg/query-service/app/integrations/builtin_integrations/mongo/assets/pipelines/log-parser.json create mode 100644 pkg/query-service/app/integrations/builtin_integrations/mongo/config/collect-logs.md rename pkg/query-service/app/integrations/builtin_integrations/mongo/config/{configure-otel-collector.md => collect-metrics.md} (57%) delete mode 100644 pkg/query-service/app/integrations/builtin_integrations/nginx/assets/pipelines/log-parser.json create mode 100644 pkg/query-service/app/integrations/builtin_integrations/nginx/config/collect-logs.md delete mode 100644 pkg/query-service/app/integrations/builtin_integrations/nginx/config/configure-otel-collector.md delete mode 100644 pkg/query-service/app/integrations/builtin_integrations/nginx/config/prepare-nginx.md create mode 100644 pkg/query-service/app/integrations/builtin_integrations/nginx/config/prerequisites.md delete mode 100644 pkg/query-service/app/integrations/builtin_integrations/redis/assets/pipelines/log-parser.json diff --git a/pkg/query-service/app/integrations/builtin_integrations/mongo/assets/pipelines/log-parser.json b/pkg/query-service/app/integrations/builtin_integrations/mongo/assets/pipelines/log-parser.json deleted file mode 100644 index e75db3ec5dfd..000000000000 --- a/pkg/query-service/app/integrations/builtin_integrations/mongo/assets/pipelines/log-parser.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "id": "parse-default-mongo-access-log", - "name": "Parse default mongo access log", - "alias": "parse-default-mongo-access-log", - "description": "Parse standard mongo access log", - "enabled": true, - "filter": { - "op": "AND", - "items": [ - { - "key": { - "type": "tag", - "key": "source", - "dataType": "string" - }, - "op": "=", - "value": "mongo" - } - ] - }, - "config": [ - { - "type": "grok_parser", - "id": "parse-body-grok", - "enabled": true, - "orderId": 1, - "name": "Parse Body", - "parse_to": "attributes", - "pattern": "%{GREEDYDATA}", - "parse_from": "body" - } - ] -} \ No newline at end of file diff --git a/pkg/query-service/app/integrations/builtin_integrations/mongo/config/collect-logs.md b/pkg/query-service/app/integrations/builtin_integrations/mongo/config/collect-logs.md new file mode 100644 index 000000000000..fa55ca9a63fc --- /dev/null +++ b/pkg/query-service/app/integrations/builtin_integrations/mongo/config/collect-logs.md @@ -0,0 +1,117 @@ +### Collect MongoDB Logs + +You can configure MongoDB logs collection by providing the required collector config to your collector. + +#### Create collector config file + +Save the following config for collecting MongoDB logs in a file named `mongodb-logs-collection-config.yaml` + +```yaml +receivers: + filelog/mongodb: + include: ["${env:MONGODB_LOG_FILE}"] + operators: + # Parse structured mongodb logs + # For more details, see https://www.mongodb.com/docs/manual/reference/log-messages/#structured-logging + - type: json_parser + if: body matches '^\\s*{\\s*".*}\\s*$' + parse_from: body + parse_to: attributes + timestamp: + parse_from: attributes.t.$$date + layout: '2006-01-02T15:04:05.000-07:00' + layout_type: gotime + severity: + parse_from: attributes.s + overwrite_text: true + mapping: + debug: + - D1 + - D2 + - D3 + - D4 + - D5 + info: I + warn: W + error: E + fatal: F + - type: flatten + if: attributes.attr != nil + field: attributes.attr + - type: move + if: attributes.msg != nil + from: attributes.msg + to: body + - type: move + if: attributes.c != nil + from: attributes.c + to: attributes.component + - type: move + if: attributes.id != nil + from: attributes.id + to: attributes.mongo_log_id + - type: remove + if: attributes.t != nil + field: attributes.t + - type: remove + if: attributes.s != nil + field: attributes.s + - type: add + field: attributes.source + value: mongodb + +processors: + batch: + send_batch_size: 10000 + send_batch_max_size: 11000 + timeout: 10s + +exporters: + # export to SigNoz cloud + otlp/mongodb-logs: + endpoint: "${env:OTLP_DESTINATION_ENDPOINT}" + tls: + insecure: false + headers: + "signoz-access-token": "${env:SIGNOZ_INGESTION_KEY}" + + # export to local collector + # otlp/mongodb-logs: + # endpoint: "localhost:4317" + # tls: + # insecure: true + + +service: + pipelines: + logs/mongodb: + receivers: [filelog/mongodb] + processors: [batch] + exporters: [otlp/mongodb-logs] +``` + +#### Set Environment Variables + +Set the following environment variables in your otel-collector environment: + +```bash + +# path of MongoDB server log file. must be accessible by the otel collector +export MONGODB_LOG_FILE=/var/log/mongodb.log + +# region specific SigNoz cloud ingestion endpoint +export OTLP_DESTINATION_ENDPOINT="ingest.us.signoz.cloud:443" + +# your SigNoz ingestion key +export SIGNOZ_INGESTION_KEY="signoz-ingestion-key" + +``` + +#### Use collector config file + +Make the collector config file available to your otel collector and use it by adding the following flag to the command for running your collector +```bash +--config mongodb-logs-collection-config.yaml +``` +Note: the collector can use multiple config files, specified by multiple occurrences of the --config flag. + diff --git a/pkg/query-service/app/integrations/builtin_integrations/mongo/config/configure-otel-collector.md b/pkg/query-service/app/integrations/builtin_integrations/mongo/config/collect-metrics.md similarity index 57% rename from pkg/query-service/app/integrations/builtin_integrations/mongo/config/configure-otel-collector.md rename to pkg/query-service/app/integrations/builtin_integrations/mongo/config/collect-metrics.md index 35238c9e9a9b..dcbc7dd58292 100644 --- a/pkg/query-service/app/integrations/builtin_integrations/mongo/config/configure-otel-collector.md +++ b/pkg/query-service/app/integrations/builtin_integrations/mongo/config/collect-metrics.md @@ -1,19 +1,21 @@ -### Configure otel collector +### Collect MongoDB Metrics -#### Save collector config file +You can configure MongoDB metrics collection by providing the required collector config to your collector. -Save the following collector config in a file named `mongo-collector-config.yaml` +#### Create collector config file -```bash +Save the following config for collecting mongodb metrics in a file named `mongodb-metrics-collection-config.yaml` + +```yaml receivers: mongodb: # - For standalone MongoDB deployments this is the hostname and port of the mongod instance # - For replica sets specify the hostnames and ports of the mongod instances that are in the replica set configuration. If the replica_set field is specified, nodes will be autodiscovered. # - For a sharded MongoDB deployment, please specify a list of the mongos hosts. hosts: - - endpoint: 127.0.0.1:27017 + - endpoint: ${env:MONGODB_ENDPOINT} # If authentication is required, the user can with clusterMonitor permissions can be provided here - username: monitoring + username: ${env:MONGODB_USERNAME} # If authentication is required, the password can be provided here. password: ${env:MONGODB_PASSWORD} collection_interval: 60s @@ -46,18 +48,19 @@ processors: hostname_sources: ["os"] exporters: - # export to local collector - otlp/local: - endpoint: "localhost:4317" - tls: - insecure: true # export to SigNoz cloud - otlp/signoz: - endpoint: "ingest.{region}.signoz.cloud:443" + otlp/mongodb: + endpoint: "${env:OTLP_DESTINATION_ENDPOINT}" tls: insecure: false headers: - "signoz-access-token": "" + "signoz-access-token": "${env:SIGNOZ_INGESTION_KEY}" + + # export to local collector + # otlp/mongodb: + # endpoint: "localhost:4317" + # tls: + # insecure: true service: pipelines: @@ -65,10 +68,37 @@ service: receivers: [mongodb] # note: remove this processor if the collector host is not running on the same host as the mongo instance processors: [resourcedetection/system] - exporters: [otlp/local] + exporters: [otlp/mongodb] + +``` + +#### Set Environment Variables + +Set the following environment variables in your otel-collector environment: + +```bash + +# MongoDB endpoint reachable from the otel collector" +export MONGODB_ENDPOINT="host:port" + +# password for MongoDB monitoring user" +export MONGODB_USERNAME="monitoring" + +# password for MongoDB monitoring user" +export MONGODB_PASSWORD="" + +# region specific SigNoz cloud ingestion endpoint +export OTLP_DESTINATION_ENDPOINT="ingest.us.signoz.cloud:443" + +# your SigNoz ingestion key +export SIGNOZ_INGESTION_KEY="signoz-ingestion-key" ``` #### Use collector config file -Run your collector with the added flag `--config mongo-collector-config.yaml` +Make the collector config file available to your otel collector and use it by adding the following flag to the command for running your collector +```bash +--config mongodb-metrics-collection-config.yaml +``` +Note: the collector can use multiple config files, specified by multiple occurrences of the --config flag. diff --git a/pkg/query-service/app/integrations/builtin_integrations/mongo/config/prerequisites.md b/pkg/query-service/app/integrations/builtin_integrations/mongo/config/prerequisites.md index 5a844d69881f..5191bfb19443 100644 --- a/pkg/query-service/app/integrations/builtin_integrations/mongo/config/prerequisites.md +++ b/pkg/query-service/app/integrations/builtin_integrations/mongo/config/prerequisites.md @@ -1,22 +1,41 @@ -### Prepare mongo for monitoring +## Before You Begin -- Have a running mongodb instance -- Have the monitoring user created -- Have the monitoring user granted the necessary permissions +To configure metrics and logs collection for MongoDB, you need the following. -Mongodb recommends to set up a least privilege user (LPU) with a `clusterMonitor` role in order to collect. +### Ensure MongoDB server is prepared for monitoring -Run the following command to create a user with the necessary permissions. +- **Ensure that the MongoDB server is running a supported version** + MongoDB versions 4.4+ are supported. + You can use the following statement to determine server version + ```js + db.version() + ``` -```bash -use admin -db.createUser( - { - user: "monitoring", - pwd: "", - roles: ["clusterMonitor"] - } -); -``` +- **If collecting metrics, ensure that there is a MongoDB user with required permissions** + Mongodb recommends to set up a least privilege user (LPU) with a clusterMonitor role in order to collect metrics -Replace `` with a strong password and set is as env var `MONGODB_PASSWORD`. + To create a monitoring user, run: + ```js + use admin + db.createUser( + { + user: "monitoring", + pwd: "", + roles: ["clusterMonitor"] + } + ); + ``` + + +### Ensure OTEL Collector is running with access to the MongoDB server + +- **Ensure that an OTEL collector is running in your deployment environment** + If needed, please [install an OTEL Collector](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/) + If already installed, ensure that the collector version is v0.88.0 or newer. + + Also ensure that you can provide config files to the collector and that you can set environment variables and command line flags used for running it. + +- **Ensure that the OTEL collector can access the MongoDB server** + In order to collect metrics, the collector must be able to access the MongoDB server as a client using the monitoring user. + + In order to collect logs, the collector must be able to read the MongoDB server log file. diff --git a/pkg/query-service/app/integrations/builtin_integrations/mongo/integration.json b/pkg/query-service/app/integrations/builtin_integrations/mongo/integration.json index c5d0fcefcd3b..b9543e07571d 100644 --- a/pkg/query-service/app/integrations/builtin_integrations/mongo/integration.json +++ b/pkg/query-service/app/integrations/builtin_integrations/mongo/integration.json @@ -18,18 +18,20 @@ "instructions": "file://config/prerequisites.md" }, { - "title": "Configure Otel Collector", - "instructions": "file://config/configure-otel-collector.md" + "title": "Collect Metrics", + "instructions": "file://config/collect-metrics.md" + }, + { + "title": "Collect Logs", + "instructions": "file://config/collect-logs.md" } ], "assets": { "logs": { - "pipelines": [ - "file://assets/pipelines/log-parser.json" - ] + "pipelines": [] }, "dashboards": [ - "file://assets/dashboards/overview.json" + "file://assets/dashboards/overview.json" ], "alerts": [] }, @@ -52,37 +54,207 @@ "data_collected": { "logs": [ { - "name": "Request Method", - "path": "attributes[\"http.request.method\"]", - "type": "string", - "description": "HTTP method" + "name": "Timestamp", + "path": "timestamp", + "type": "timestamp" }, { - "name": "Request Path", - "path": "attributes[\"url.path\"]", - "type": "string", - "description": "path requested" + "name": "Severity Text", + "path": "severity_text", + "type": "string" }, { - "name": "Response Status Code", - "path": "attributes[\"http.response.status_code\"]", - "type": "int", - "description": "HTTP response code" + "name": "Severity Number", + "path": "severity_number", + "type": "number" + }, + { + "name": "MongoDB Component", + "path": "attributes.component", + "type": "string" } ], "metrics": [ { - "name": "http.server.request.duration", - "type": "Histogram", - "unit": "s", - "description": "Duration of HTTP server requests" + "description": "The number of cache operations of the instance.", + "unit": "number", + "type": "Sum", + "name": "mongodb_cache_operations" }, { - "name": "http.server.active_requests", - "type": "UpDownCounter", - "unit": "{ request }", - "description": "Number of active HTTP server requests" + "description": "The number of collections.", + "unit": "number", + "type": "Sum", + "name": "mongodb_collection_count" + }, + { + "description": "The size of the collection. Data compression does not affect this value.", + "unit": "Bytes", + "type": "Sum", + "name": "mongodb_data_size" + }, + { + "description": "The number of connections.", + "unit": "number", + "type": "Sum", + "name": "mongodb_connection_count" + }, + { + "description": "The number of extents.", + "unit": "number", + "type": "Sum", + "name": "mongodb_extent_count" + }, + { + "description": "The time the global lock has been held.", + "unit": "ms", + "type": "Sum", + "name": "mongodb_global_lock_time" + }, + { + "description": "The number of indexes.", + "unit": "number", + "type": "Sum", + "name": "mongodb_index_count" + }, + { + "description": "Sum of the space allocated to all indexes in the database, including free index space.", + "unit": "Bytes", + "type": "Sum", + "name": "mongodb_index_size" + }, + { + "description": "The amount of memory used.", + "unit": "Bytes", + "type": "Sum", + "name": "mongodb_memory_usage" + }, + { + "description": "The number of objects.", + "unit": "number", + "type": "Sum", + "name": "mongodb_object_count" + }, + { + "description": "The latency of operations.", + "unit": "us", + "type": "Gauge", + "name": "mongodb_operation_latency_time" + }, + { + "description": "The number of operations executed.", + "unit": "number", + "type": "Sum", + "name": "mongodb_operation_count" + }, + { + "description": "The number of replicated operations executed.", + "unit": "number", + "type": "Sum", + "name": "mongodb_operation_repl_count" + }, + { + "description": "The total amount of storage allocated to this collection.", + "unit": "Bytes", + "type": "Sum", + "name": "mongodb_storage_size" + }, + { + "description": "The number of existing databases.", + "unit": "number", + "type": "Sum", + "name": "mongodb_database_count" + }, + { + "description": "The number of times an index has been accessed.", + "unit": "number", + "type": "Sum", + "name": "mongodb_index_access_count" + }, + { + "description": "The number of document operations executed.", + "unit": "number", + "type": "Sum", + "name": "mongodb_document_operation_count" + }, + { + "description": "The number of bytes received.", + "unit": "Bytes", + "type": "Sum", + "name": "mongodb_network_io_receive" + }, + { + "description": "The number of by transmitted.", + "unit": "Bytes", + "type": "Sum", + "name": "mongodb_network_io_transmit" + }, + { + "description": "The number of requests received by the server.", + "unit": "number", + "type": "Sum", + "name": "mongodb_network_request_count" + }, + { + "description": "The total time spent performing operations.", + "unit": "ms", + "type": "Sum", + "name": "mongodb_operation_time" + }, + { + "description": "The total number of active sessions.", + "unit": "number", + "type": "Sum", + "name": "mongodb_session_count" + }, + { + "description": "The number of open cursors maintained for clients.", + "unit": "number", + "type": "Sum", + "name": "mongodb_cursor_count" + }, + { + "description": "The number of cursors that have timed out.", + "unit": "number", + "type": "Sum", + "name": "mongodb_cursor_timeout_count" + }, + { + "description": "Number of times the lock was acquired in the specified mode.", + "unit": "number", + "type": "Sum", + "name": "mongodb_lock_acquire_count" + }, + { + "description": "Number of times the lock acquisitions encountered waits because the locks were held in a conflicting mode.", + "unit": "number", + "type": "Sum", + "name": "mongodb_lock_acquire_wait_count" + }, + { + "description": "Cumulative wait time for the lock acquisitions.", + "unit": "microseconds", + "type": "Sum", + "name": "mongodb_lock_acquire_time" + }, + { + "description": "Number of times the lock acquisitions encountered deadlocks.", + "unit": "number", + "type": "Sum", + "name": "mongodb_lock_deadlock_count" + }, + { + "description": "The health status of the server.", + "unit": "number", + "type": "Gauge", + "name": "mongodb_health" + }, + { + "description": "The amount of time that the server has been running.", + "unit": "ms", + "type": "Sum", + "name": "mongodb_uptime" } ] } -} +} \ No newline at end of file diff --git a/pkg/query-service/app/integrations/builtin_integrations/mongo/overview.md b/pkg/query-service/app/integrations/builtin_integrations/mongo/overview.md index c7a84541ad91..c088a9aa44a6 100644 --- a/pkg/query-service/app/integrations/builtin_integrations/mongo/overview.md +++ b/pkg/query-service/app/integrations/builtin_integrations/mongo/overview.md @@ -1,3 +1,6 @@ ### Monitor MongoDB with SigNoz -Collect key MongoDB metrics and parse your MongoDB logs +Collect key MongoDB metrics and view them with an out of the box dashboard. + +Collect and parse MongoDB logs to populate timestamp, severity, and other log attributes for better querying and aggregation. + diff --git a/pkg/query-service/app/integrations/builtin_integrations/nginx/assets/pipelines/log-parser.json b/pkg/query-service/app/integrations/builtin_integrations/nginx/assets/pipelines/log-parser.json deleted file mode 100644 index e9521e45ff1c..000000000000 --- a/pkg/query-service/app/integrations/builtin_integrations/nginx/assets/pipelines/log-parser.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "id": "parse-default-nginx-access-log", - "name": "Parse default nginx access log", - "alias": "parse-default-nginx-access-log", - "description": "Parse standard nginx access log", - "enabled": true, - "filter": { - "op": "AND", - "items": [ - { - "key": { - "type": "tag", - "key": "source", - "dataType": "string" - }, - "op": "=", - "value": "nginx" - } - ] - }, - "config": [ - { - "type": "grok_parser", - "id": "parse-body-grok", - "enabled": true, - "orderId": 1, - "name": "Parse Body", - "parse_to": "attributes", - "pattern": "%{IP:client.address} - %{USERNAME:enduser.id} \\[%{HTTPDATE:time.local}\\] \"((%{WORD:http.method} %{DATA:http.path}(\\?%{DATA:http.query})? %{WORD:network.protocol.name}/%{NOTSPACE:network.protocol.version})|%{DATA})\" %{INT:http.response.status_code:int} %{INT:http.request.body.bytes:int} \"%{NOTSPACE:http.referer}\" \"%{DATA:http.user.agent}\" %{INT:http.request.bytes:int} %{NUMBER:http.request.time:float} \\[%{DATA:proxy.upstream.name}?\\] \\[%{DATA:proxy.alternative.upstream.name}?\\] ((%{IP:network.peer.address}:%{INT:network.peer.port:int})|%{DATA})? (%{INT:http.response.bytes:int}|-)? (%{NUMBER:http.response.time:float}|-)? (%{NUMBER:network.peer.status.code:int}|-)? %{NOTSPACE:request.id}", - "parse_from": "body" - }, - { - "type": "severity_parser", - "id": "parse-sev", - "enabled": true, - "orderId": 2, - "name": "Set Severity", - "parse_from": "attributes[\"http.response.status_code\"]", - "mapping": { - "debug": [ - "1xx" - ], - "error": [ - "4xx" - ], - "fatal": [ - "5xx" - ], - "info": [ - "2xx" - ], - "trace": [ - "trace" - ], - "warn": [ - "3xx" - ] - }, - "overwrite_text": true - } - ] -} \ No newline at end of file diff --git a/pkg/query-service/app/integrations/builtin_integrations/nginx/config/collect-logs.md b/pkg/query-service/app/integrations/builtin_integrations/nginx/config/collect-logs.md new file mode 100644 index 000000000000..b421478ab901 --- /dev/null +++ b/pkg/query-service/app/integrations/builtin_integrations/nginx/config/collect-logs.md @@ -0,0 +1,139 @@ +### Collect Nginx Logs + +You can configure Nginx logs collection by providing the required collector config to your collector. + +#### Create collector config file + +Save the following config for collecting Nginx logs in a file named `nginx-logs-collection-config.yaml` + +```yaml +receivers: + filelog/nginx-access-logs: + include: ["${env:NGINX_ACCESS_LOG_FILE}"] + operators: + # Parse the default nginx access log format. Nginx defaults to the "combined" log format + # $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" + # For more details, see https://nginx.org/en/docs/http/ngx_http_log_module.html + - type: regex_parser + if: body matches '^(?P[0-9\\.]+) - (?P[^\\s]+) \\[(?P.+)\\] "(?P\\w+?) (?P.+?)" (?P[0-9]+) (?P[0-9]+) "(?P.+?)" "(?P.+?)"$' + parse_from: body + parse_to: attributes + regex: '^(?P[0-9\.]+) - (?P[^\s]+) \[(?P.+)\] "(?P\w+?) (?P.+?)" (?P[0-9]+) (?P[0-9]+) "(?P.+?)" "(?P.+?)"$' + timestamp: + parse_from: attributes.ts + layout: "02/Jan/2006:15:04:05 -0700" + layout_type: gotime + severity: + parse_from: attributes.status + overwrite_text: true + mapping: + debug: "1xx" + info: + - "2xx" + - "3xx" + warn: "4xx" + error: "5xx" + - type: remove + if: attributes.ts != nil + field: attributes.ts + - type: add + field: attributes.source + value: nginx + + filelog/nginx-error-logs: + include: ["${env:NGINX_ERROR_LOG_FILE}"] + operators: + # Parse the default nginx error log format. + # YYYY/MM/DD HH:MM:SS [LEVEL] PID#TID: *CID MESSAGE + # For more details, see https://github.com/phusion/nginx/blob/master/src/core/ngx_log.c + - type: regex_parser + if: body matches '^(?P.+?) \\[(?P\\w+)\\] (?P\\d+)#(?P\\d+). \\*(?P\\d+) (?P.+)$' + parse_from: body + parse_to: attributes + regex: '^(?P.+?) \[(?P\w+)\] (?P\d+)#(?P\d+). \*(?P\d+) (?P.+)$' + timestamp: + parse_from: attributes.ts + layout: "2006/01/02 15:04:05" + layout_type: gotime + severity: + parse_from: attributes.log_level + overwrite_text: true + mapping: + debug: "debug" + info: + - "info" + - "notice" + warn: "warn" + error: + - "error" + - "crit" + - "alert" + fatal: "emerg" + - type: remove + if: attributes.ts != nil + field: attributes.ts + - type: move + if: attributes.message != nil + from: attributes.message + to: body + - type: add + field: attributes.source + value: nginx + +processors: + batch: + send_batch_size: 10000 + send_batch_max_size: 11000 + timeout: 10s + +exporters: + # export to SigNoz cloud + otlp/nginx-logs: + endpoint: "${env:OTLP_DESTINATION_ENDPOINT}" + tls: + insecure: false + headers: + "signoz-access-token": "${env:SIGNOZ_INGESTION_KEY}" + + # export to local collector + # otlp/nginx-logs: + # endpoint: "localhost:4317" + # tls: + # insecure: true + +service: + pipelines: + logs/nginx: + receivers: [filelog/nginx-access-logs, filelog/nginx-error-logs] + processors: [batch] + exporters: [otlp/nginx-logs] + +``` + +#### Set Environment Variables + +Set the following environment variables in your otel-collector environment: + +```bash + +# path of Nginx access log file. must be accessible by the otel collector +export NGINX_ACCESS_LOG_FILE=/var/log/nginx/access.log; + +# path of Nginx error log file. must be accessible by the otel collector +export NGINX_ERROR_LOG_FILE=/var/log/nginx/error.log + +# region specific SigNoz cloud ingestion endpoint +export OTLP_DESTINATION_ENDPOINT="ingest.us.signoz.cloud:443" + +# your SigNoz ingestion key +export SIGNOZ_INGESTION_KEY="signoz-ingestion-key" + +``` + +#### Use collector config file + +Make the collector config file available to your otel collector and use it by adding the following flag to the command for running your collector +```bash +--config nginx-logs-collection-config.yaml +``` +Note: the collector can use multiple config files, specified by multiple occurrences of the --config flag. diff --git a/pkg/query-service/app/integrations/builtin_integrations/nginx/config/configure-otel-collector.md b/pkg/query-service/app/integrations/builtin_integrations/nginx/config/configure-otel-collector.md deleted file mode 100644 index f5c22e16cb65..000000000000 --- a/pkg/query-service/app/integrations/builtin_integrations/nginx/config/configure-otel-collector.md +++ /dev/null @@ -1 +0,0 @@ -### Configure otel collector diff --git a/pkg/query-service/app/integrations/builtin_integrations/nginx/config/prepare-nginx.md b/pkg/query-service/app/integrations/builtin_integrations/nginx/config/prepare-nginx.md deleted file mode 100644 index 2677d09b6be9..000000000000 --- a/pkg/query-service/app/integrations/builtin_integrations/nginx/config/prepare-nginx.md +++ /dev/null @@ -1 +0,0 @@ -### Prepare nginx for observability diff --git a/pkg/query-service/app/integrations/builtin_integrations/nginx/config/prerequisites.md b/pkg/query-service/app/integrations/builtin_integrations/nginx/config/prerequisites.md new file mode 100644 index 000000000000..f2ce762f2156 --- /dev/null +++ b/pkg/query-service/app/integrations/builtin_integrations/nginx/config/prerequisites.md @@ -0,0 +1,19 @@ +## Before You Begin + +To configure logs collection for Nginx, you need the following. + +### Ensure Nginx server is running a supported version + +Ensure that your Nginx server is running a version newer than 1.0.0 + + +### Ensure OTEL Collector is running with access to the Nginx server + +- **Ensure that an OTEL collector is running in your deployment environment** + If needed, please [install an OTEL Collector](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/) + If already installed, ensure that the collector version is v0.88.0 or newer. + + Also ensure that you can provide config files to the collector and that you can set environment variables and command line flags used for running it. + +- **Ensure that the OTEL collector can access the Nginx server** + In order to collect logs, the collector must be able to read Nginx server log files. diff --git a/pkg/query-service/app/integrations/builtin_integrations/nginx/integration.json b/pkg/query-service/app/integrations/builtin_integrations/nginx/integration.json index 558f9780d094..16f03bbed3ed 100644 --- a/pkg/query-service/app/integrations/builtin_integrations/nginx/integration.json +++ b/pkg/query-service/app/integrations/builtin_integrations/nginx/integration.json @@ -15,19 +15,17 @@ "overview": "file://overview.md", "configuration": [ { - "title": "Prepare Nginx", - "instructions": "file://config/prepare-nginx.md" + "title": "Prerequisites", + "instructions": "file://config/prerequisites.md" }, { - "title": "Configure Otel Collector", - "instructions": "file://config/configure-otel-collector.md" + "title": "Collect Logs", + "instructions": "file://config/collect-logs.md" } ], "assets": { "logs": { - "pipelines": [ - "file://assets/pipelines/log-parser.json" - ] + "pipelines": [] }, "dashboards": null, "alerts": null @@ -50,38 +48,57 @@ }, "data_collected": { "logs": [ + { + "name": "Timestamp", + "path": "timestamp", + "type": "timestamp" + }, + { + "name": "Severity Text", + "path": "severity_text", + "type": "string" + }, + { + "name": "Severity Number", + "path": "severity_number", + "type": "number" + }, + { + "name": "Body Bytes Sent", + "path": "attributes.body_bytes_sent", + "type": "string" + }, + { + "name": "Referrer", + "path": "attributes.http_referrer", + "type": "string" + }, + { + "name": "User Agent", + "path": "attributes.http_user_agent", + "type": "string" + }, { "name": "Request Method", - "path": "attributes[\"http.request.method\"]", - "type": "string", - "description": "HTTP method" + "path": "attributes.request_method", + "type": "string" }, { "name": "Request Path", - "path": "attributes[\"url.path\"]", - "type": "string", - "description": "path requested" + "path": "attributes.request_path", + "type": "string" }, { "name": "Response Status Code", - "path": "attributes[\"http.response.status_code\"]", - "type": "int", - "description": "HTTP response code" - } - ], - "metrics": [ - { - "name": "http.server.request.duration", - "type": "Histogram", - "unit": "s", - "description": "Duration of HTTP server requests" + "path": "attributes.status", + "type": "string" }, { - "name": "http.server.active_requests", - "type": "UpDownCounter", - "unit": "{ request }", - "description": "Number of active HTTP server requests" + "name": "Remote Address", + "path": "attributes.remote_addr", + "type": "string" } - ] + ], + "metrics": [] } -} +} \ No newline at end of file diff --git a/pkg/query-service/app/integrations/builtin_integrations/nginx/overview.md b/pkg/query-service/app/integrations/builtin_integrations/nginx/overview.md index dac6354fc09e..8c17af806c6f 100644 --- a/pkg/query-service/app/integrations/builtin_integrations/nginx/overview.md +++ b/pkg/query-service/app/integrations/builtin_integrations/nginx/overview.md @@ -1,3 +1,3 @@ ### Monitor Nginx with SigNoz -Parse your Nginx logs and collect key metrics. +Collect and parse Nginx logs to populate timestamp, severity, and other log attributes for better querying and aggregation. diff --git a/pkg/query-service/app/integrations/builtin_integrations/postgres/config/collect-logs.md b/pkg/query-service/app/integrations/builtin_integrations/postgres/config/collect-logs.md index f048ec63b0bc..0c199061a7d7 100644 --- a/pkg/query-service/app/integrations/builtin_integrations/postgres/config/collect-logs.md +++ b/pkg/query-service/app/integrations/builtin_integrations/postgres/config/collect-logs.md @@ -35,7 +35,7 @@ receivers: - LOG - NOTICE - DETAIL - warning: WARNING + warn: WARNING error: ERROR fatal: - FATAL diff --git a/pkg/query-service/app/integrations/builtin_integrations/redis/assets/pipelines/log-parser.json b/pkg/query-service/app/integrations/builtin_integrations/redis/assets/pipelines/log-parser.json deleted file mode 100644 index d06760e0b8aa..000000000000 --- a/pkg/query-service/app/integrations/builtin_integrations/redis/assets/pipelines/log-parser.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "id": "parse-default-redis-access-log", - "name": "Parse default redis access log", - "alias": "parse-default-redis-access-log", - "description": "Parse standard redis access log", - "enabled": true, - "filter": { - "op": "AND", - "items": [ - { - "key": { - "type": "tag", - "key": "source", - "dataType": "string" - }, - "op": "=", - "value": "redis" - } - ] - }, - "config": [ - { - "type": "grok_parser", - "id": "parse-body-grok", - "enabled": true, - "orderId": 1, - "name": "Parse Body", - "parse_to": "attributes", - "pattern": "%{GREEDYDATA}", - "parse_from": "body" - } - ] -} \ No newline at end of file diff --git a/pkg/query-service/app/integrations/builtin_integrations/redis/config/collect-logs.md b/pkg/query-service/app/integrations/builtin_integrations/redis/config/collect-logs.md index 7be122de4ca2..e8b26ef710e5 100644 --- a/pkg/query-service/app/integrations/builtin_integrations/redis/config/collect-logs.md +++ b/pkg/query-service/app/integrations/builtin_integrations/redis/config/collect-logs.md @@ -29,7 +29,7 @@ receivers: info: - '-' - '*' - warning: '#' + warn: '#' on_error: send - type: move if: attributes.message != nil diff --git a/pkg/query-service/app/integrations/builtin_integrations/redis/integration.json b/pkg/query-service/app/integrations/builtin_integrations/redis/integration.json index a1f27ead7201..e3f5ef2e3c7d 100644 --- a/pkg/query-service/app/integrations/builtin_integrations/redis/integration.json +++ b/pkg/query-service/app/integrations/builtin_integrations/redis/integration.json @@ -28,9 +28,7 @@ ], "assets": { "logs": { - "pipelines": [ - "file://assets/pipelines/log-parser.json" - ] + "pipelines": [] }, "dashboards": [ "file://assets/dashboards/overview.json" diff --git a/pkg/query-service/tests/integration/signoz_integrations_test.go b/pkg/query-service/tests/integration/signoz_integrations_test.go index 292e353401cf..d58ccaf51a1f 100644 --- a/pkg/query-service/tests/integration/signoz_integrations_test.go +++ b/pkg/query-service/tests/integration/signoz_integrations_test.go @@ -141,9 +141,14 @@ func TestLogPipelinesForInstalledSignozIntegrations(t *testing.T) { break } } - require.NotNil(testAvailableIntegration) + + if testAvailableIntegration == nil { + // None of the built in integrations include a pipeline right now. + return + } // Installing an integration should add its pipelines to pipelines list + require.NotNil(testAvailableIntegration) require.False(testAvailableIntegration.IsInstalled) integrationsTB.RequestQSToInstallIntegration( testAvailableIntegration.Id, map[string]interface{}{}, From da4a6266c5478b7c3af12a706305c5c69ca0e20a Mon Sep 17 00:00:00 2001 From: Vishal Sharma Date: Thu, 28 Mar 2024 21:43:41 +0530 Subject: [PATCH 08/68] feat: add events API (#4761) --- ee/query-service/app/server.go | 4 +-- ee/query-service/license/manager.go | 4 +-- .../app/clickhouseReader/reader.go | 6 ++-- pkg/query-service/app/http_handler.go | 27 +++++++++++++--- pkg/query-service/app/parser.go | 13 ++++++++ pkg/query-service/app/server.go | 4 +-- pkg/query-service/auth/auth.go | 4 +-- pkg/query-service/dao/sqlite/rbac.go | 2 +- pkg/query-service/model/queryParams.go | 5 +++ pkg/query-service/telemetry/telemetry.go | 31 ++++++++++--------- 10 files changed, 68 insertions(+), 32 deletions(-) diff --git a/ee/query-service/app/server.go b/ee/query-service/app/server.go index c742eef01b90..dfdff149399f 100644 --- a/ee/query-service/app/server.go +++ b/ee/query-service/app/server.go @@ -445,7 +445,7 @@ func extractQueryRangeV3Data(path string, r *http.Request) (map[string]interface data["tracesUsed"] = signozTracesUsed userEmail, err := baseauth.GetEmailFromJwt(r.Context()) if err == nil { - telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_QUERY_RANGE_API, data, userEmail) + telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_QUERY_RANGE_API, data, userEmail, true, false) } } return data, true @@ -488,7 +488,7 @@ func (s *Server) analyticsMiddleware(next http.Handler) http.Handler { if _, ok := telemetry.EnabledPaths()[path]; ok { userEmail, err := baseauth.GetEmailFromJwt(r.Context()) if err == nil { - telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_PATH, data, userEmail) + telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_PATH, data, userEmail, true, false) } } diff --git a/ee/query-service/license/manager.go b/ee/query-service/license/manager.go index 56cb685fecb9..d348b6d216a1 100644 --- a/ee/query-service/license/manager.go +++ b/ee/query-service/license/manager.go @@ -204,7 +204,7 @@ func (lm *Manager) Validate(ctx context.Context) (reterr error) { zap.L().Error("License validation completed with error", zap.Error(reterr)) atomic.AddUint64(&lm.failedAttempts, 1) telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_LICENSE_CHECK_FAILED, - map[string]interface{}{"err": reterr.Error()}, "") + map[string]interface{}{"err": reterr.Error()}, "", true, false) } else { zap.L().Info("License validation completed with no errors") } @@ -263,7 +263,7 @@ func (lm *Manager) Activate(ctx context.Context, key string) (licenseResponse *m userEmail, err := auth.GetEmailFromJwt(ctx) if err == nil { telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_LICENSE_ACT_FAILED, - map[string]interface{}{"err": errResponse.Err.Error()}, userEmail) + map[string]interface{}{"err": errResponse.Err.Error()}, userEmail, true, false) } } }() diff --git a/pkg/query-service/app/clickhouseReader/reader.go b/pkg/query-service/app/clickhouseReader/reader.go index a1b12d941579..1f5b2c2eb5a5 100644 --- a/pkg/query-service/app/clickhouseReader/reader.go +++ b/pkg/query-service/app/clickhouseReader/reader.go @@ -3802,7 +3802,7 @@ func (r *ClickHouseReader) GetLogs(ctx context.Context, params *model.LogsFilter if lenFilters != 0 { userEmail, err := auth.GetEmailFromJwt(ctx) if err == nil { - telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_LOGS_FILTERS, data, userEmail) + telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_LOGS_FILTERS, data, userEmail, true, false) } } @@ -3844,7 +3844,7 @@ func (r *ClickHouseReader) TailLogs(ctx context.Context, client *model.LogsTailC if lenFilters != 0 { userEmail, err := auth.GetEmailFromJwt(ctx) if err == nil { - telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_LOGS_FILTERS, data, userEmail) + telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_LOGS_FILTERS, data, userEmail, true, false) } } @@ -3936,7 +3936,7 @@ func (r *ClickHouseReader) AggregateLogs(ctx context.Context, params *model.Logs if lenFilters != 0 { userEmail, err := auth.GetEmailFromJwt(ctx) if err == nil { - telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_LOGS_FILTERS, data, userEmail) + telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_LOGS_FILTERS, data, userEmail, true, false) } } diff --git a/pkg/query-service/app/http_handler.go b/pkg/query-service/app/http_handler.go index c025345cef9e..aab6cb339363 100644 --- a/pkg/query-service/app/http_handler.go +++ b/pkg/query-service/app/http_handler.go @@ -401,6 +401,8 @@ func (aH *APIHandler) RegisterRoutes(router *mux.Router, am *AuthMiddleware) { router.HandleFunc("/api/v1/explorer/views/{viewId}", am.EditAccess(aH.deleteSavedView)).Methods(http.MethodDelete) router.HandleFunc("/api/v1/feedback", am.OpenAccess(aH.submitFeedback)).Methods(http.MethodPost) + router.HandleFunc("/api/v1/events", am.ViewAccess(aH.registerEvent)).Methods(http.MethodPost) + // router.HandleFunc("/api/v1/get_percentiles", aH.getApplicationPercentiles).Methods(http.MethodGet) router.HandleFunc("/api/v1/services", am.ViewAccess(aH.getServices)).Methods(http.MethodPost) router.HandleFunc("/api/v1/services/list", am.ViewAccess(aH.getServicesList)).Methods(http.MethodGet) @@ -1502,7 +1504,22 @@ func (aH *APIHandler) submitFeedback(w http.ResponseWriter, r *http.Request) { } userEmail, err := auth.GetEmailFromJwt(r.Context()) if err == nil { - telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_INPRODUCT_FEEDBACK, data, userEmail) + telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_INPRODUCT_FEEDBACK, data, userEmail, true, false) + } +} + +func (aH *APIHandler) registerEvent(w http.ResponseWriter, r *http.Request) { + + request, err := parseRegisterEventRequest(r) + if aH.HandleError(w, err, http.StatusBadRequest) { + return + } + userEmail, err := auth.GetEmailFromJwt(r.Context()) + if err == nil { + telemetry.GetInstance().SendEvent(request.EventName, request.Attributes, userEmail, true, true) + aH.WriteJSON(w, r, map[string]string{"data": "Event Processed Successfully"}) + } else { + RespondError(w, &model.ApiError{Typ: model.ErrorInternal, Err: err}, nil) } } @@ -1585,7 +1602,7 @@ func (aH *APIHandler) getServices(w http.ResponseWriter, r *http.Request) { } userEmail, err := auth.GetEmailFromJwt(r.Context()) if err == nil { - telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_NUMBER_OF_SERVICES, data, userEmail) + telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_NUMBER_OF_SERVICES, data, userEmail, true, false) } if (data["number"] != 0) && (data["number"] != telemetry.DEFAULT_NUMBER_OF_SERVICES) { @@ -2310,7 +2327,7 @@ func (aH *APIHandler) editOrg(w http.ResponseWriter, r *http.Request) { "organizationName": req.Name, } userEmail, err := auth.GetEmailFromJwt(r.Context()) - telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_ORG_SETTINGS, data, userEmail) + telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_ORG_SETTINGS, data, userEmail, true, false) aH.WriteJSON(w, r, map[string]string{"data": "org updated successfully"}) } @@ -3525,7 +3542,7 @@ func sendQueryResultEvents(r *http.Request, result []*v3.Result, queryRangeParam "metricsUsed": signozMetricsUsed, "dashboardId": dashboardID, "widgetId": widgetID, - }, userEmail) + }, userEmail, true, false) } if alertMatched { var alertID string @@ -3547,7 +3564,7 @@ func sendQueryResultEvents(r *http.Request, result []*v3.Result, queryRangeParam "logsUsed": signozLogsUsed, "metricsUsed": signozMetricsUsed, "alertId": alertID, - }, userEmail) + }, userEmail, true, false) } } } diff --git a/pkg/query-service/app/parser.go b/pkg/query-service/app/parser.go index 9a9f388ab59a..670f5eff25ac 100644 --- a/pkg/query-service/app/parser.go +++ b/pkg/query-service/app/parser.go @@ -66,6 +66,19 @@ func parseGetTopOperationsRequest(r *http.Request) (*model.GetTopOperationsParam return postData, nil } +func parseRegisterEventRequest(r *http.Request) (*model.RegisterEventParams, error) { + var postData *model.RegisterEventParams + err := json.NewDecoder(r.Body).Decode(&postData) + if err != nil { + return nil, err + } + if postData.EventName == "" { + return nil, errors.New("eventName param missing in query") + } + + return postData, nil +} + func parseMetricsTime(s string) (time.Time, error) { if t, err := strconv.ParseFloat(s, 64); err == nil { s, ns := math.Modf(t) diff --git a/pkg/query-service/app/server.go b/pkg/query-service/app/server.go index 549e74e9765a..cb34b048ea03 100644 --- a/pkg/query-service/app/server.go +++ b/pkg/query-service/app/server.go @@ -452,7 +452,7 @@ func extractQueryRangeV3Data(path string, r *http.Request) (map[string]interface data["tracesUsed"] = signozTracesUsed userEmail, err := auth.GetEmailFromJwt(r.Context()) if err == nil { - telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_QUERY_RANGE_API, data, userEmail) + telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_QUERY_RANGE_API, data, userEmail, true, false) } } return data, true @@ -496,7 +496,7 @@ func (s *Server) analyticsMiddleware(next http.Handler) http.Handler { if _, ok := telemetry.EnabledPaths()[path]; ok { userEmail, err := auth.GetEmailFromJwt(r.Context()) if err == nil { - telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_PATH, data, userEmail) + telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_PATH, data, userEmail, true, false) } } // } diff --git a/pkg/query-service/auth/auth.go b/pkg/query-service/auth/auth.go index 0a90c8c730e5..f0d220df81e0 100644 --- a/pkg/query-service/auth/auth.go +++ b/pkg/query-service/auth/auth.go @@ -89,7 +89,7 @@ func Invite(ctx context.Context, req *model.InviteRequest) (*model.InviteRespons telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_USER_INVITATION_SENT, map[string]interface{}{ "invited user email": req.Email, - }, au.Email) + }, au.Email, true, false) // send email if SMTP is enabled if os.Getenv("SMTP_ENABLED") == "true" && req.FrontendBaseUrl != "" { @@ -404,7 +404,7 @@ func RegisterInvitedUser(ctx context.Context, req *RegisterRequest, nopassword b } telemetry.GetInstance().IdentifyUser(user) - telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_USER_INVITATION_ACCEPTED, nil, req.Email) + telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_USER_INVITATION_ACCEPTED, nil, req.Email, true, false) return user, nil } diff --git a/pkg/query-service/dao/sqlite/rbac.go b/pkg/query-service/dao/sqlite/rbac.go index c28a2b675ca8..aba9beb0650f 100644 --- a/pkg/query-service/dao/sqlite/rbac.go +++ b/pkg/query-service/dao/sqlite/rbac.go @@ -203,7 +203,7 @@ func (mds *ModelDaoSqlite) CreateUser(ctx context.Context, } telemetry.GetInstance().IdentifyUser(user) - telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_USER, data, user.Email) + telemetry.GetInstance().SendEvent(telemetry.TELEMETRY_EVENT_USER, data, user.Email, true, false) return user, nil } diff --git a/pkg/query-service/model/queryParams.go b/pkg/query-service/model/queryParams.go index 754de3eae0cd..11020a0abf05 100644 --- a/pkg/query-service/model/queryParams.go +++ b/pkg/query-service/model/queryParams.go @@ -164,6 +164,11 @@ type GetTopOperationsParams struct { Limit int `json:"limit"` } +type RegisterEventParams struct { + EventName string `json:"eventName"` + Attributes map[string]interface{} `json:"attributes"` +} + type GetUsageParams struct { StartTime string EndTime string diff --git a/pkg/query-service/telemetry/telemetry.go b/pkg/query-service/telemetry/telemetry.go index 4c23cbd092ba..03b21855ba10 100644 --- a/pkg/query-service/telemetry/telemetry.go +++ b/pkg/query-service/telemetry/telemetry.go @@ -197,7 +197,7 @@ func createTelemetry() { data := map[string]interface{}{} telemetry.SetTelemetryEnabled(constants.IsTelemetryEnabled()) - telemetry.SendEvent(TELEMETRY_EVENT_HEART_BEAT, data, "") + telemetry.SendEvent(TELEMETRY_EVENT_HEART_BEAT, data, "", true, false) ticker := time.NewTicker(HEART_BEAT_DURATION) activeUserTicker := time.NewTicker(ACTIVE_USER_DURATION) @@ -231,7 +231,12 @@ func createTelemetry() { if (telemetry.activeUser["traces"] != 0) || (telemetry.activeUser["metrics"] != 0) || (telemetry.activeUser["logs"] != 0) { telemetry.activeUser["any"] = 1 } - telemetry.SendEvent(TELEMETRY_EVENT_ACTIVE_USER, map[string]interface{}{"traces": telemetry.activeUser["traces"], "metrics": telemetry.activeUser["metrics"], "logs": telemetry.activeUser["logs"], "any": telemetry.activeUser["any"]}, "") + telemetry.SendEvent(TELEMETRY_EVENT_ACTIVE_USER, map[string]interface{}{ + "traces": telemetry.activeUser["traces"], + "metrics": telemetry.activeUser["metrics"], + "logs": telemetry.activeUser["logs"], + "any": telemetry.activeUser["any"]}, + "", true, false) telemetry.activeUser = map[string]int8{"traces": 0, "metrics": 0, "logs": 0, "any": 0} case <-ticker.C: @@ -239,15 +244,15 @@ func createTelemetry() { tagsInfo, _ := telemetry.reader.GetTagsInfoInLastHeartBeatInterval(context.Background(), HEART_BEAT_DURATION) if len(tagsInfo.Env) != 0 { - telemetry.SendEvent(TELEMETRY_EVENT_ENVIRONMENT, map[string]interface{}{"value": tagsInfo.Env}, "") + telemetry.SendEvent(TELEMETRY_EVENT_ENVIRONMENT, map[string]interface{}{"value": tagsInfo.Env}, "", true, false) } for language, _ := range tagsInfo.Languages { - telemetry.SendEvent(TELEMETRY_EVENT_LANGUAGE, map[string]interface{}{"language": language}, "") + telemetry.SendEvent(TELEMETRY_EVENT_LANGUAGE, map[string]interface{}{"language": language}, "", true, false) } for service, _ := range tagsInfo.Services { - telemetry.SendEvent(TELEMETRY_EVENT_SERVICE, map[string]interface{}{"serviceName": service}, "") + telemetry.SendEvent(TELEMETRY_EVENT_SERVICE, map[string]interface{}{"serviceName": service}, "", true, false) } totalSpans, _ := telemetry.reader.GetTotalSpans(context.Background()) @@ -280,7 +285,7 @@ func createTelemetry() { for key, value := range tsInfo { data[key] = value } - telemetry.SendEvent(TELEMETRY_EVENT_HEART_BEAT, data, "") + telemetry.SendEvent(TELEMETRY_EVENT_HEART_BEAT, data, "", true, false) alertsInfo, err := telemetry.reader.GetAlertsInfo(context.Background()) if err == nil { @@ -307,18 +312,18 @@ func createTelemetry() { } // send event only if there are dashboards or alerts or channels if dashboardsInfo.TotalDashboards > 0 || alertsInfo.TotalAlerts > 0 || len(*channels) > 0 || savedViewsInfo.TotalSavedViews > 0 { - telemetry.SendEvent(TELEMETRY_EVENT_DASHBOARDS_ALERTS, dashboardsAlertsData, "") + telemetry.SendEvent(TELEMETRY_EVENT_DASHBOARDS_ALERTS, dashboardsAlertsData, "", true, false) } } } } } if err != nil { - telemetry.SendEvent(TELEMETRY_EVENT_DASHBOARDS_ALERTS, map[string]interface{}{"error": err.Error()}, "") + telemetry.SendEvent(TELEMETRY_EVENT_DASHBOARDS_ALERTS, map[string]interface{}{"error": err.Error()}, "", true, false) } getDistributedInfoInLastHeartBeatInterval, _ := telemetry.reader.GetDistributedInfoInLastHeartBeatInterval(context.Background()) - telemetry.SendEvent(TELEMETRY_EVENT_DISTRIBUTED, getDistributedInfoInLastHeartBeatInterval, "") + telemetry.SendEvent(TELEMETRY_EVENT_DISTRIBUTED, getDistributedInfoInLastHeartBeatInterval, "", true, false) } } }() @@ -426,7 +431,7 @@ func (a *Telemetry) checkEvents(event string) bool { return sendEvent } -func (a *Telemetry) SendEvent(event string, data map[string]interface{}, userEmail string, opts ...bool) { +func (a *Telemetry) SendEvent(event string, data map[string]interface{}, userEmail string, rateLimitFlag bool, viaEventsAPI bool) { // ignore telemetry for default user if userEmail == DEFAULT_CLOUD_EMAIL || a.GetUserEmail() == DEFAULT_CLOUD_EMAIL { @@ -436,10 +441,6 @@ func (a *Telemetry) SendEvent(event string, data map[string]interface{}, userEma if userEmail != "" { a.SetUserEmail(userEmail) } - rateLimitFlag := true - if len(opts) > 0 { - rateLimitFlag = opts[0] - } if !a.isTelemetryEnabled() { return @@ -485,7 +486,7 @@ func (a *Telemetry) SendEvent(event string, data map[string]interface{}, userEma // check if event is part of SAAS_EVENTS_LIST _, isSaaSEvent := SAAS_EVENTS_LIST[event] - if a.saasOperator != nil && a.GetUserEmail() != "" && isSaaSEvent { + if a.saasOperator != nil && a.GetUserEmail() != "" && (isSaaSEvent || viaEventsAPI) { a.saasOperator.Enqueue(analytics.Track{ Event: event, UserId: a.GetUserEmail(), From e6e377beff550b5505a708cedd8688055f15b0cf Mon Sep 17 00:00:00 2001 From: Vikrant Gupta Date: Fri, 29 Mar 2024 11:08:33 +0530 Subject: [PATCH 09/68] fix: billing graph page crash (#4764) --- .../BillingContainer/BillingUsageGraph/BillingUsageGraph.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/container/BillingContainer/BillingUsageGraph/BillingUsageGraph.tsx b/frontend/src/container/BillingContainer/BillingUsageGraph/BillingUsageGraph.tsx index be77ebba9542..a11488595fc3 100644 --- a/frontend/src/container/BillingContainer/BillingUsageGraph/BillingUsageGraph.tsx +++ b/frontend/src/container/BillingContainer/BillingUsageGraph/BillingUsageGraph.tsx @@ -46,7 +46,7 @@ const calculateStartEndTime = ( ): { startTime: number; endTime: number } => { const timestamps: number[] = []; data?.details?.breakdown?.forEach((breakdown: any) => { - breakdown?.dayWiseBreakdown?.breakdown.forEach((entry: any) => { + breakdown?.dayWiseBreakdown?.breakdown?.forEach((entry: any) => { timestamps.push(entry?.timestamp); }); }); From 7c2f5352d29980fed6514b06509545d4c15e68b4 Mon Sep 17 00:00:00 2001 From: Rajat Dabade Date: Fri, 29 Mar 2024 14:41:16 +0530 Subject: [PATCH 10/68] [Refactor]: Table Grid Formula issue. (#4758) * refactor: change the logic to match data from another query * refactor: updated logic * refactor: clean up * refactor: updated case to handle formula * chore: nit * refactor: isEqual instead of nested loops * chore: added comments * refactor: updated logic * refactor: clean up * refactor: updated case to handle formula * chore: nit * refactor: isEqual instead of nested loops --- .../src/lib/query/createTableColumnsFromQuery.ts | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/frontend/src/lib/query/createTableColumnsFromQuery.ts b/frontend/src/lib/query/createTableColumnsFromQuery.ts index d62e0a763f45..1a7afbbc22eb 100644 --- a/frontend/src/lib/query/createTableColumnsFromQuery.ts +++ b/frontend/src/lib/query/createTableColumnsFromQuery.ts @@ -7,7 +7,7 @@ import { import { FORMULA_REGEXP } from 'constants/regExp'; import { QUERY_TABLE_CONFIG } from 'container/QueryTable/config'; import { QueryTableProps } from 'container/QueryTable/QueryTable.intefaces'; -import { isObject } from 'lodash-es'; +import { isEqual, isObject } from 'lodash-es'; import { ReactNode } from 'react'; import { IBuilderFormula, @@ -258,12 +258,7 @@ const findSeriaValueFromAnotherQuery = ( const localLabelEntries = Object.entries(seria.labels); if (localLabelEntries.length !== labelEntries.length) return; - const isExistLabels = localLabelEntries.find(([key, value]) => - labelEntries.find( - ([currentKey, currentValue]) => - currentKey === key && currentValue === value, - ), - ); + const isExistLabels = isEqual(localLabelEntries, labelEntries); if (isExistLabels) { value = seria; @@ -304,10 +299,9 @@ const fillRestAggregationData = ( if (targetSeria) { const isEqual = isEqualQueriesByLabel(equalQueriesByLabels, column.field); if (!isEqual) { + // This line is crucial. It ensures that no additional rows are added to the table for similar labels across all formulas here is how this check is applied: signoz/frontend/src/lib/query/createTableColumnsFromQuery.ts line number 370 equalQueriesByLabels.push(column.field); } - - column.data.push(parseFloat(targetSeria.values[0].value).toFixed(2)); } else { column.data.push('N/A'); } @@ -357,6 +351,7 @@ const fillDataFromSeries = ( } if (column.type !== 'field' && column.field !== queryName) { + // This code is executed only when there are multiple formulas. It checks if there are similar labels present in other formulas and, if found, adds them to the corresponding column data in the table. fillRestAggregationData( column, queryTableData, From 6eced60bf5354f9cdae5ae9e30efded3c8f48a7b Mon Sep 17 00:00:00 2001 From: Yunus M Date: Fri, 29 Mar 2024 14:53:48 +0530 Subject: [PATCH 11/68] =?UTF-8?q?feat:=20update=20time=20range=20selection?= =?UTF-8?q?=20flows=20to=20handle=20relative=20and=20absolu=E2=80=A6=20(#4?= =?UTF-8?q?742)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: update time range selection flows to handle relative and absolute times * fix: lint error * fix: lint error * feat: update logic to handle custom relative times on load and standardize relative time formats * fix: type issue * fix: handle light mode and on custom time range select * chore: update alert frequency corresponding times * chore: update copy URL * feat: update styles --- .../CustomTimePicker/CustomTimePicker.tsx | 33 ++- frontend/src/constants/query.ts | 1 + .../FormAlertRules/ChartPreview/index.tsx | 9 +- .../src/container/FormAlertRules/utils.ts | 24 +- .../GridCardLayout/GridCard/index.tsx | 8 +- .../src/container/LogsExplorerChart/index.tsx | 8 +- .../src/container/LogsSearchFilter/utils.ts | 7 +- .../WidgetGraph/WidgetGraphs.tsx | 8 +- .../src/container/ServiceApplication/types.ts | 7 +- .../container/TopNav/AutoRefresh/config.ts | 4 +- .../container/TopNav/AutoRefreshV2/config.ts | 4 +- .../TopNav/DateTimeSelection/config.ts | 81 ++++-- .../TopNav/DateTimeSelection/index.tsx | 10 +- .../DateTimeSelectionV2.styles.scss | 66 ++++- .../TopNav/DateTimeSelectionV2/config.ts | 152 ++++++++---- .../TopNav/DateTimeSelectionV2/index.tsx | 234 +++++++++++++++--- frontend/src/hooks/logs/useCopyLogLink.ts | 24 +- frontend/src/hooks/useQueryService.ts | 7 +- frontend/src/lib/dashboard/getQueryResults.ts | 7 +- frontend/src/lib/getMinMax.ts | 76 ++++-- frontend/src/lib/getStartEndRangeTime.ts | 7 +- frontend/src/store/actions/global.ts | 7 +- frontend/src/store/actions/trace/util.ts | 5 +- frontend/src/types/actions/globalTime.ts | 7 +- frontend/src/types/reducer/globalTime.ts | 7 +- 25 files changed, 636 insertions(+), 167 deletions(-) diff --git a/frontend/src/components/CustomTimePicker/CustomTimePicker.tsx b/frontend/src/components/CustomTimePicker/CustomTimePicker.tsx index a29f0180b4e9..114db1792401 100644 --- a/frontend/src/components/CustomTimePicker/CustomTimePicker.tsx +++ b/frontend/src/components/CustomTimePicker/CustomTimePicker.tsx @@ -5,13 +5,14 @@ import './CustomTimePicker.styles.scss'; import { Input, Popover, Tooltip, Typography } from 'antd'; import cx from 'classnames'; import { DateTimeRangeType } from 'container/TopNav/CustomDateTimeModal'; -import { Options } from 'container/TopNav/DateTimeSelection/config'; import { FixedDurationSuggestionOptions, + Options, RelativeDurationSuggestionOptions, } from 'container/TopNav/DateTimeSelectionV2/config'; import dayjs from 'dayjs'; -import { defaultTo, noop } from 'lodash-es'; +import { isValidTimeFormat } from 'lib/getMinMax'; +import { defaultTo, isFunction, noop } from 'lodash-es'; import debounce from 'lodash-es/debounce'; import { CheckCircle, ChevronDown, Clock } from 'lucide-react'; import { @@ -33,7 +34,14 @@ interface CustomTimePickerProps { onError: (value: boolean) => void; selectedValue: string; selectedTime: string; - onValidCustomDateChange: ([t1, t2]: any[]) => void; + onValidCustomDateChange: ({ + time: [t1, t2], + timeStr, + }: { + time: [dayjs.Dayjs | null, dayjs.Dayjs | null]; + timeStr: string; + }) => void; + onCustomTimeStatusUpdate?: (isValid: boolean) => void; open: boolean; setOpen: Dispatch>; items: any[]; @@ -53,6 +61,7 @@ function CustomTimePicker({ open, setOpen, onValidCustomDateChange, + onCustomTimeStatusUpdate, newPopover, customDateTimeVisible, setCustomDTPickerVisible, @@ -85,6 +94,7 @@ function CustomTimePicker({ return Options[index].label; } } + for ( let index = 0; index < RelativeDurationSuggestionOptions.length; @@ -94,12 +104,17 @@ function CustomTimePicker({ return RelativeDurationSuggestionOptions[index].label; } } + for (let index = 0; index < FixedDurationSuggestionOptions.length; index++) { if (FixedDurationSuggestionOptions[index].value === selectedTime) { return FixedDurationSuggestionOptions[index].label; } } + if (isValidTimeFormat(selectedTime)) { + return selectedTime; + } + return ''; }; @@ -161,13 +176,22 @@ function CustomTimePicker({ setInputStatus('error'); onError(true); setInputErrorMessage('Please enter time less than 6 months'); + if (isFunction(onCustomTimeStatusUpdate)) { + onCustomTimeStatusUpdate(true); + } } else { - onValidCustomDateChange([minTime, currentTime]); + onValidCustomDateChange({ + time: [minTime, currentTime], + timeStr: inputValue, + }); } } else { setInputStatus('error'); onError(true); setInputErrorMessage(null); + if (isFunction(onCustomTimeStatusUpdate)) { + onCustomTimeStatusUpdate(false); + } } }, 300); @@ -320,4 +344,5 @@ CustomTimePicker.defaultProps = { setCustomDTPickerVisible: noop, onCustomDateHandler: noop, handleGoLive: noop, + onCustomTimeStatusUpdate: noop, }; diff --git a/frontend/src/constants/query.ts b/frontend/src/constants/query.ts index 31ec5fcd20a4..6b70ae9786f1 100644 --- a/frontend/src/constants/query.ts +++ b/frontend/src/constants/query.ts @@ -29,4 +29,5 @@ export enum QueryParams { expandedWidgetId = 'expandedWidgetId', integration = 'integration', pagination = 'pagination', + relativeTime = 'relativeTime', } diff --git a/frontend/src/container/FormAlertRules/ChartPreview/index.tsx b/frontend/src/container/FormAlertRules/ChartPreview/index.tsx index 6e8c167c2992..2110216cf135 100644 --- a/frontend/src/container/FormAlertRules/ChartPreview/index.tsx +++ b/frontend/src/container/FormAlertRules/ChartPreview/index.tsx @@ -7,7 +7,10 @@ import GridPanelSwitch from 'container/GridPanelSwitch'; import { getFormatNameByOptionId } from 'container/NewWidget/RightContainer/alertFomatCategories'; import { timePreferenceType } from 'container/NewWidget/RightContainer/timeItems'; import { Time } from 'container/TopNav/DateTimeSelection/config'; -import { Time as TimeV2 } from 'container/TopNav/DateTimeSelectionV2/config'; +import { + CustomTimeType, + Time as TimeV2, +} from 'container/TopNav/DateTimeSelectionV2/config'; import { useGetQueryRange } from 'hooks/queryBuilder/useGetQueryRange'; import { useIsDarkMode } from 'hooks/useDarkMode'; import { useResizeObserver } from 'hooks/useDimensions'; @@ -39,7 +42,7 @@ export interface ChartPreviewProps { query: Query | null; graphType?: PANEL_TYPES; selectedTime?: timePreferenceType; - selectedInterval?: Time | TimeV2; + selectedInterval?: Time | TimeV2 | CustomTimeType; headline?: JSX.Element; alertDef?: AlertDef; userQueryKey?: string; @@ -53,7 +56,7 @@ function ChartPreview({ query, graphType = PANEL_TYPES.TIME_SERIES, selectedTime = 'GLOBAL_TIME', - selectedInterval = '5min', + selectedInterval = '5m', headline, userQueryKey, allowSelectedIntervalForStepGen = false, diff --git a/frontend/src/container/FormAlertRules/utils.ts b/frontend/src/container/FormAlertRules/utils.ts index 0d41ac51979f..3015f0c42666 100644 --- a/frontend/src/container/FormAlertRules/utils.ts +++ b/frontend/src/container/FormAlertRules/utils.ts @@ -12,22 +12,30 @@ import { // toChartInterval converts eval window to chart selection time interval export const toChartInterval = (evalWindow: string | undefined): Time => { switch (evalWindow) { + case '1m0s': + return '1m'; case '5m0s': - return '5min'; + return '5m'; case '10m0s': - return '10min'; + return '10m'; case '15m0s': - return '15min'; + return '15m'; case '30m0s': - return '30min'; + return '30m'; case '1h0m0s': - return '1hr'; + return '1h'; + case '3h0m0s': + return '3h'; case '4h0m0s': - return '4hr'; + return '4h'; + case '6h0m0s': + return '6h'; + case '12h0m0s': + return '12h'; case '24h0m0s': - return '1day'; + return '1d'; default: - return '5min'; + return '5m'; } }; diff --git a/frontend/src/container/GridCardLayout/GridCard/index.tsx b/frontend/src/container/GridCardLayout/GridCard/index.tsx index 33df881c80f1..1633f0b947e2 100644 --- a/frontend/src/container/GridCardLayout/GridCard/index.tsx +++ b/frontend/src/container/GridCardLayout/GridCard/index.tsx @@ -1,6 +1,7 @@ import { DEFAULT_ENTITY_VERSION } from 'constants/app'; import { QueryParams } from 'constants/query'; import { PANEL_TYPES } from 'constants/queryBuilder'; +import { CustomTimeType } from 'container/TopNav/DateTimeSelectionV2/config'; import { useGetQueryRange } from 'hooks/queryBuilder/useGetQueryRange'; import { useStepInterval } from 'hooks/queryBuilder/useStepInterval'; import { useIsDarkMode } from 'hooks/useDarkMode'; @@ -81,8 +82,13 @@ function GridCardGraph({ const searchParams = new URLSearchParams(window.location.search); const startTime = searchParams.get(QueryParams.startTime); const endTime = searchParams.get(QueryParams.endTime); + const relativeTime = searchParams.get( + QueryParams.relativeTime, + ) as CustomTimeType; - if (startTime && endTime && startTime !== endTime) { + if (relativeTime) { + dispatch(UpdateTimeInterval(relativeTime)); + } else if (startTime && endTime && startTime !== endTime) { dispatch( UpdateTimeInterval('custom', [ parseInt(getTimeString(startTime), 10), diff --git a/frontend/src/container/LogsExplorerChart/index.tsx b/frontend/src/container/LogsExplorerChart/index.tsx index 2f909bea253a..7f4d6485292c 100644 --- a/frontend/src/container/LogsExplorerChart/index.tsx +++ b/frontend/src/container/LogsExplorerChart/index.tsx @@ -2,6 +2,7 @@ import Graph from 'components/Graph'; import Spinner from 'components/Spinner'; import { QueryParams } from 'constants/query'; import { themeColors } from 'constants/theme'; +import { CustomTimeType } from 'container/TopNav/DateTimeSelectionV2/config'; import useUrlQuery from 'hooks/useUrlQuery'; import getChartData, { GetChartDataProps } from 'lib/getChartData'; import GetMinMax from 'lib/getMinMax'; @@ -65,8 +66,13 @@ function LogsExplorerChart({ const searchParams = new URLSearchParams(window.location.search); const startTime = searchParams.get(QueryParams.startTime); const endTime = searchParams.get(QueryParams.endTime); + const relativeTime = searchParams.get( + QueryParams.relativeTime, + ) as CustomTimeType; - if (startTime && endTime && startTime !== endTime) { + if (relativeTime) { + dispatch(UpdateTimeInterval(relativeTime)); + } else if (startTime && endTime && startTime !== endTime) { dispatch( UpdateTimeInterval('custom', [ parseInt(getTimeString(startTime), 10), diff --git a/frontend/src/container/LogsSearchFilter/utils.ts b/frontend/src/container/LogsSearchFilter/utils.ts index 390a3c14b06f..91f47e6eccf4 100644 --- a/frontend/src/container/LogsSearchFilter/utils.ts +++ b/frontend/src/container/LogsSearchFilter/utils.ts @@ -1,9 +1,12 @@ import { Time } from 'container/TopNav/DateTimeSelection/config'; -import { Time as TimeV2 } from 'container/TopNav/DateTimeSelectionV2/config'; +import { + CustomTimeType, + Time as TimeV2, +} from 'container/TopNav/DateTimeSelectionV2/config'; import { GetMinMaxPayload } from 'lib/getMinMax'; export const getGlobalTime = ( - selectedTime: Time | TimeV2, + selectedTime: Time | TimeV2 | CustomTimeType, globalTime: GetMinMaxPayload, ): GetMinMaxPayload | undefined => { if (selectedTime === 'custom') { diff --git a/frontend/src/container/NewWidget/LeftContainer/WidgetGraph/WidgetGraphs.tsx b/frontend/src/container/NewWidget/LeftContainer/WidgetGraph/WidgetGraphs.tsx index aa7553af53e2..7245d960f92f 100644 --- a/frontend/src/container/NewWidget/LeftContainer/WidgetGraph/WidgetGraphs.tsx +++ b/frontend/src/container/NewWidget/LeftContainer/WidgetGraph/WidgetGraphs.tsx @@ -3,6 +3,7 @@ import { PANEL_TYPES } from 'constants/queryBuilder'; import GridPanelSwitch from 'container/GridPanelSwitch'; import { ThresholdProps } from 'container/NewWidget/RightContainer/Threshold/types'; import { timePreferance } from 'container/NewWidget/RightContainer/timeItems'; +import { CustomTimeType } from 'container/TopNav/DateTimeSelectionV2/config'; import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; import { useIsDarkMode } from 'hooks/useDarkMode'; import { useResizeObserver } from 'hooks/useDimensions'; @@ -97,8 +98,13 @@ function WidgetGraph({ const searchParams = new URLSearchParams(window.location.search); const startTime = searchParams.get(QueryParams.startTime); const endTime = searchParams.get(QueryParams.endTime); + const relativeTime = searchParams.get( + QueryParams.relativeTime, + ) as CustomTimeType; - if (startTime && endTime && startTime !== endTime) { + if (relativeTime) { + dispatch(UpdateTimeInterval(relativeTime)); + } else if (startTime && endTime && startTime !== endTime) { dispatch( UpdateTimeInterval('custom', [ parseInt(getTimeString(startTime), 10), diff --git a/frontend/src/container/ServiceApplication/types.ts b/frontend/src/container/ServiceApplication/types.ts index 0717538cb891..4733b3053a09 100644 --- a/frontend/src/container/ServiceApplication/types.ts +++ b/frontend/src/container/ServiceApplication/types.ts @@ -1,6 +1,9 @@ import { ServiceDataProps } from 'api/metrics/getTopLevelOperations'; import { Time } from 'container/TopNav/DateTimeSelection/config'; -import { Time as TimeV2 } from 'container/TopNav/DateTimeSelectionV2/config'; +import { + CustomTimeType, + Time as TimeV2, +} from 'container/TopNav/DateTimeSelectionV2/config'; import { GetQueryResultsProps } from 'lib/dashboard/getQueryResults'; import { UseQueryResult } from 'react-query'; import { SuccessResponse } from 'types/api'; @@ -25,7 +28,7 @@ export interface GetQueryRangeRequestDataProps { topLevelOperations: [keyof ServiceDataProps, string[]][]; maxTime: number; minTime: number; - globalSelectedInterval: Time | TimeV2; + globalSelectedInterval: Time | TimeV2 | CustomTimeType; } export interface GetServiceListFromQueryProps { diff --git a/frontend/src/container/TopNav/AutoRefresh/config.ts b/frontend/src/container/TopNav/AutoRefresh/config.ts index 64aaca6c6480..99c9db8ca51a 100644 --- a/frontend/src/container/TopNav/AutoRefresh/config.ts +++ b/frontend/src/container/TopNav/AutoRefresh/config.ts @@ -1,7 +1,7 @@ import GetMinMax, { GetMinMaxPayload } from 'lib/getMinMax'; import { Time } from '../DateTimeSelection/config'; -import { Time as TimeV2 } from '../DateTimeSelectionV2/config'; +import { CustomTimeType, Time as TimeV2 } from '../DateTimeSelectionV2/config'; export const options: IOptions[] = [ { @@ -68,7 +68,7 @@ export interface IOptions { } export const getMinMax = ( - selectedTime: Time | TimeV2, + selectedTime: Time | TimeV2 | CustomTimeType, minTime: number, maxTime: number, ): GetMinMaxPayload => diff --git a/frontend/src/container/TopNav/AutoRefreshV2/config.ts b/frontend/src/container/TopNav/AutoRefreshV2/config.ts index a84f932fbc8b..8baae51d01c0 100644 --- a/frontend/src/container/TopNav/AutoRefreshV2/config.ts +++ b/frontend/src/container/TopNav/AutoRefreshV2/config.ts @@ -1,7 +1,7 @@ import GetMinMax, { GetMinMaxPayload } from 'lib/getMinMax'; import { Time } from '../DateTimeSelection/config'; -import { Time as TimeV2 } from '../DateTimeSelectionV2/config'; +import { CustomTimeType, Time as TimeV2 } from '../DateTimeSelectionV2/config'; export const options: IOptions[] = [ { @@ -68,7 +68,7 @@ export interface IOptions { } export const getMinMax = ( - selectedTime: Time | TimeV2, + selectedTime: Time | TimeV2 | CustomTimeType, minTime: number, maxTime: number, ): GetMinMaxPayload => diff --git a/frontend/src/container/TopNav/DateTimeSelection/config.ts b/frontend/src/container/TopNav/DateTimeSelection/config.ts index 3618686c95af..102fe00c432d 100644 --- a/frontend/src/container/TopNav/DateTimeSelection/config.ts +++ b/frontend/src/container/TopNav/DateTimeSelection/config.ts @@ -1,16 +1,18 @@ import ROUTES from 'constants/routes'; -type FiveMin = '5min'; -type TenMin = '10min'; -type FifteenMin = '15min'; -type ThirtyMin = '30min'; -type OneMin = '1min'; -type SixHour = '6hr'; -type OneHour = '1hr'; -type FourHour = '4hr'; -type OneDay = '1day'; -type ThreeDay = '3days'; -type OneWeek = '1week'; +type FiveMin = '5m'; +type TenMin = '10m'; +type FifteenMin = '15m'; +type ThirtyMin = '30m'; +type OneMin = '1m'; +type SixHour = '6h'; +type OneHour = '1h'; +type FourHour = '4h'; +type ThreeHour = '3h'; +type TwelveHour = '12h'; +type OneDay = '1d'; +type ThreeDay = '3d'; +type OneWeek = '1w'; type Custom = 'custom'; export type Time = @@ -22,37 +24,62 @@ export type Time = | FourHour | SixHour | OneHour + | ThreeHour | Custom | OneWeek | OneDay + | TwelveHour | ThreeDay; export const Options: Option[] = [ - { value: '5min', label: 'Last 5 min' }, - { value: '15min', label: 'Last 15 min' }, - { value: '30min', label: 'Last 30 min' }, - { value: '1hr', label: 'Last 1 hour' }, - { value: '6hr', label: 'Last 6 hour' }, - { value: '1day', label: 'Last 1 day' }, - { value: '3days', label: 'Last 3 days' }, - { value: '1week', label: 'Last 1 week' }, + { value: '5m', label: 'Last 5 min' }, + { value: '15m', label: 'Last 15 min' }, + { value: '30m', label: 'Last 30 min' }, + { value: '1h', label: 'Last 1 hour' }, + { value: '6h', label: 'Last 6 hour' }, + { value: '1d', label: 'Last 1 day' }, + { value: '3d', label: 'Last 3 days' }, + { value: '1w', label: 'Last 1 week' }, { value: 'custom', label: 'Custom' }, ]; +type TimeFrame = { + '5min': string; + '15min': string; + '30min': string; + '1hr': string; + '6hr': string; + '1day': string; + '3days': string; + '1week': string; + [key: string]: string; // Index signature to allow any string as index +}; + +export const RelativeTimeMap: TimeFrame = { + '5min': '5m', + '15min': '15m', + '30min': '30m', + '1hr': '1h', + '6hr': '6h', + '1day': '1d', + '3days': '3d', + '1week': '1w', +}; + export interface Option { value: Time; label: string; } export const RelativeDurationOptions: Option[] = [ - { value: '5min', label: 'Last 5 min' }, - { value: '15min', label: 'Last 15 min' }, - { value: '30min', label: 'Last 30 min' }, - { value: '1hr', label: 'Last 1 hour' }, - { value: '6hr', label: 'Last 6 hour' }, - { value: '1day', label: 'Last 1 day' }, - { value: '3days', label: 'Last 3 days' }, - { value: '1week', label: 'Last 1 week' }, + { value: '5m', label: 'Last 5 min' }, + { value: '15m', label: 'Last 15 min' }, + { value: '30m', label: 'Last 30 min' }, + { value: '1h', label: 'Last 1 hour' }, + { value: '6h', label: 'Last 6 hour' }, + { value: '1d', label: 'Last 1 day' }, + { value: '3d', label: 'Last 3 days' }, + { value: '1w', label: 'Last 1 week' }, ]; export const getDefaultOption = (route: string): Time => { diff --git a/frontend/src/container/TopNav/DateTimeSelection/index.tsx b/frontend/src/container/TopNav/DateTimeSelection/index.tsx index 614e977a1242..3d023959f2cc 100644 --- a/frontend/src/container/TopNav/DateTimeSelection/index.tsx +++ b/frontend/src/container/TopNav/DateTimeSelection/index.tsx @@ -28,7 +28,7 @@ import { GlobalReducer } from 'types/reducer/globalTime'; import AutoRefresh from '../AutoRefresh'; import CustomDateTimeModal, { DateTimeRangeType } from '../CustomDateTimeModal'; -import { Time as TimeV2 } from '../DateTimeSelectionV2/config'; +import { CustomTimeType, Time as TimeV2 } from '../DateTimeSelectionV2/config'; import { getDefaultOption, getOptions, @@ -122,7 +122,7 @@ function DateTimeSelection({ const getInputLabel = ( startTime?: Dayjs, endTime?: Dayjs, - timeInterval: Time | TimeV2 = '15min', + timeInterval: Time | TimeV2 | CustomTimeType = '15m', ): string | Time => { if (startTime && endTime && timeInterval === 'custom') { const format = 'YYYY/MM/DD HH:mm'; @@ -225,7 +225,7 @@ function DateTimeSelection({ [location.pathname], ); - const onSelectHandler = (value: Time | TimeV2): void => { + const onSelectHandler = (value: Time | TimeV2 | CustomTimeType): void => { if (value !== 'custom') { updateTimeInterval(value); updateLocalStorageForRoutes(value); @@ -358,7 +358,7 @@ function DateTimeSelection({ }} selectedTime={selectedTime} onValidCustomDateChange={(dateTime): void => - onCustomDateHandler(dateTime as DateTimeRangeType) + onCustomDateHandler(dateTime.time as DateTimeRangeType) } selectedValue={getInputLabel( dayjs(minTime / 1000000), @@ -406,7 +406,7 @@ function DateTimeSelection({ interface DispatchProps { updateTimeInterval: ( - interval: Time | TimeV2, + interval: Time | TimeV2 | CustomTimeType, dateTimeRange?: [number, number], ) => (dispatch: Dispatch) => void; globalTimeLoading: () => void; diff --git a/frontend/src/container/TopNav/DateTimeSelectionV2/DateTimeSelectionV2.styles.scss b/frontend/src/container/TopNav/DateTimeSelectionV2/DateTimeSelectionV2.styles.scss index bd4cc3cdb105..22efca500997 100644 --- a/frontend/src/container/TopNav/DateTimeSelectionV2/DateTimeSelectionV2.styles.scss +++ b/frontend/src/container/TopNav/DateTimeSelectionV2/DateTimeSelectionV2.styles.scss @@ -54,9 +54,61 @@ } } } + + .share-link-btn { + height: 34px; + } + + .shareable-link-popover { + margin-left: 8px; + } } -.date-time-root { +.share-modal-content { + display: flex; + flex-direction: column; + gap: 8px; + padding: 16px; + width: 420px; + + .absolute-relative-time-toggler-container { + display: flex; + gap: 8px; + align-items: center; + } + + .absolute-relative-time-toggler { + display: flex; + gap: 4px; + align-items: center; + } + + .absolute-relative-time-error { + font-size: 12px; + color: var(--bg-amber-600); + } + + .share-link { + display: flex; + align-items: center; + + .share-url { + flex: 1; + border: 1px solid var(--bg-slate-400); + border-radius: 2px; + background: var(--bg-ink-300); + height: 32px; + padding: 6px 8px; + } + + .copy-url-btn { + width: 32px; + } + } +} + +.date-time-root, +.shareable-link-popover-root { .ant-popover-inner { border-radius: 4px !important; border: 1px solid var(--bg-slate-400); @@ -185,7 +237,8 @@ } } - .date-time-root { + .date-time-root, + .shareable-link-popover-root { .ant-popover-inner { border: 1px solid var(--bg-vanilla-400); background: var(--bg-vanilla-100) !important; @@ -234,4 +287,13 @@ } } } + + .share-modal-content { + .share-link { + .share-url { + border: 1px solid var(--bg-vanilla-300); + background: var(--bg-vanilla-100); + } + } + } } diff --git a/frontend/src/container/TopNav/DateTimeSelectionV2/config.ts b/frontend/src/container/TopNav/DateTimeSelectionV2/config.ts index 623150558081..f92beb6b8dc3 100644 --- a/frontend/src/container/TopNav/DateTimeSelectionV2/config.ts +++ b/frontend/src/container/TopNav/DateTimeSelectionV2/config.ts @@ -1,24 +1,24 @@ /* eslint-disable sonarjs/no-duplicate-string */ import ROUTES from 'constants/routes'; -type FiveMin = '5min'; -type TenMin = '10min'; -type FifteenMin = '15min'; -type ThirtyMin = '30min'; -type FortyFiveMin = '45min'; -type OneMin = '1min'; -type ThreeHour = '3hr'; -type SixHour = '6hr'; -type OneHour = '1hr'; -type FourHour = '4hr'; -type TwelveHour = '12hr'; -type OneDay = '1day'; -type ThreeDay = '3days'; -type FourDay = '4days'; -type TenDay = '10days'; -type OneWeek = '1week'; -type TwoWeek = '2weeks'; -type SixWeek = '6weeks'; +type FiveMin = '5m'; +type TenMin = '10m'; +type FifteenMin = '15m'; +type ThirtyMin = '30m'; +type FortyFiveMin = '45m'; +type OneMin = '1m'; +type ThreeHour = '3h'; +type SixHour = '6h'; +type OneHour = '1h'; +type FourHour = '4h'; +type TwelveHour = '12h'; +type OneDay = '1d'; +type ThreeDay = '3d'; +type FourDay = '4d'; +type TenDay = '10d'; +type OneWeek = '1w'; +type TwoWeek = '2w'; +type SixWeek = '6w'; type TwoMonths = '2months'; type Custom = 'custom'; @@ -44,15 +44,19 @@ export type Time = | TwoWeek | TwoMonths; +export type TimeUnit = 'm' | 'h' | 'd' | 'w'; + +export type CustomTimeType = `${string}${TimeUnit}`; + export const Options: Option[] = [ - { value: '5min', label: 'Last 5 minutes' }, - { value: '15min', label: 'Last 15 minutes' }, - { value: '30min', label: 'Last 30 minutes' }, - { value: '1hr', label: 'Last 1 hour' }, - { value: '6hr', label: 'Last 6 hours' }, - { value: '1day', label: 'Last 1 day' }, - { value: '3days', label: 'Last 3 days' }, - { value: '1week', label: 'Last 1 week' }, + { value: '5m', label: 'Last 5 minutes' }, + { value: '15m', label: 'Last 15 minutes' }, + { value: '30m', label: 'Last 30 minutes' }, + { value: '1h', label: 'Last 1 hour' }, + { value: '6h', label: 'Last 6 hours' }, + { value: '1d', label: 'Last 1 day' }, + { value: '3d', label: 'Last 3 days' }, + { value: '1w', label: 'Last 1 week' }, { value: 'custom', label: 'Custom' }, ]; @@ -61,36 +65,92 @@ export interface Option { label: string; } +export const OLD_RELATIVE_TIME_VALUES = [ + '1min', + '10min', + '15min', + '1hr', + '30min', + '45min', + '5min', + '1day', + '3days', + '4days', + '10days', + '1week', + '2weeks', + '6weeks', + '3hr', + '4hr', + '6hr', + '12hr', +]; + export const RelativeDurationOptions: Option[] = [ - { value: '5min', label: 'Last 5 minutes' }, - { value: '15min', label: 'Last 15 minutes' }, - { value: '30min', label: 'Last 30 minutes' }, - { value: '1hr', label: 'Last 1 hour' }, - { value: '6hr', label: 'Last 6 hour' }, - { value: '1day', label: 'Last 1 day' }, - { value: '3days', label: 'Last 3 days' }, - { value: '1week', label: 'Last 1 week' }, + { value: '5m', label: 'Last 5 minutes' }, + { value: '15m', label: 'Last 15 minutes' }, + { value: '30m', label: 'Last 30 minutes' }, + { value: '1h', label: 'Last 1 hour' }, + { value: '6h', label: 'Last 6 hour' }, + { value: '1d', label: 'Last 1 day' }, + { value: '3d', label: 'Last 3 days' }, + { value: '1w', label: 'Last 1 week' }, ]; export const RelativeDurationSuggestionOptions: Option[] = [ - { value: '3hr', label: '3h' }, - { value: '4days', label: '4d' }, - { value: '6weeks', label: '6w' }, - { value: '12hr', label: '12 hours' }, - { value: '10days', label: '10d' }, - { value: '2weeks', label: '2 weeks' }, + { value: '3h', label: 'Last 3 hours' }, + { value: '4d', label: 'Last 4 days' }, + { value: '6w', label: 'Last 6 weeks' }, + { value: '12h', label: 'Last 12 hours' }, + { value: '10d', label: 'Last 10 days' }, + { value: '2w', label: 'Last 2 weeks' }, { value: '2months', label: 'Last 2 months' }, - { value: '1day', label: 'today' }, + { value: '1d', label: 'today' }, ]; export const FixedDurationSuggestionOptions: Option[] = [ - { value: '45min', label: '45m' }, - { value: '12hr', label: '12 hours' }, - { value: '10days', label: '10d' }, - { value: '2weeks', label: '2 weeks' }, + { value: '45m', label: 'Last 45 mins' }, + { value: '12h', label: 'Last 12 hours' }, + { value: '10d', label: 'Last 10 days' }, + { value: '2w', label: 'Last 2 weeks' }, { value: '2months', label: 'Last 2 months' }, - { value: '1day', label: 'today' }, + { value: '1d', label: 'today' }, ]; +export const convertOldTimeToNewValidCustomTimeFormat = ( + time: string, +): CustomTimeType => { + const regex = /^(\d+)([a-zA-Z]+)/; + const match = regex.exec(time); + + if (match) { + let unit = 'm'; + + switch (match[2]) { + case 'min': + unit = 'm'; + break; + case 'hr': + unit = 'h'; + break; + case 'day': + case 'days': + unit = 'd'; + break; + case 'week': + case 'weeks': + unit = 'w'; + break; + + default: + break; + } + + return `${match[1]}${unit}` as CustomTimeType; + } + + return '30m'; +}; + export const getDefaultOption = (route: string): Time => { if (route === ROUTES.SERVICE_MAP) { return RelativeDurationOptions[2].value; diff --git a/frontend/src/container/TopNav/DateTimeSelectionV2/index.tsx b/frontend/src/container/TopNav/DateTimeSelectionV2/index.tsx index 3ef5125ad724..3fa36610a0ae 100644 --- a/frontend/src/container/TopNav/DateTimeSelectionV2/index.tsx +++ b/frontend/src/container/TopNav/DateTimeSelectionV2/index.tsx @@ -1,7 +1,8 @@ import './DateTimeSelectionV2.styles.scss'; import { SyncOutlined } from '@ant-design/icons'; -import { Button } from 'antd'; +import { Color } from '@signozhq/design-tokens'; +import { Button, Popover, Switch, Typography } from 'antd'; import getLocalStorageKey from 'api/browser/localstorage/get'; import setLocalStorageKey from 'api/browser/localstorage/set'; import CustomTimePicker from 'components/CustomTimePicker/CustomTimePicker'; @@ -26,10 +27,12 @@ import GetMinMax from 'lib/getMinMax'; import getTimeString from 'lib/getTimeString'; import history from 'lib/history'; import { isObject } from 'lodash-es'; +import { Check, Copy, Info, Send } from 'lucide-react'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useQueryClient } from 'react-query'; import { connect, useSelector } from 'react-redux'; import { RouteComponentProps, withRouter } from 'react-router-dom'; +import { useCopyToClipboard } from 'react-use'; import { bindActionCreators, Dispatch } from 'redux'; import { ThunkDispatch } from 'redux-thunk'; import { GlobalTimeLoading, UpdateTimeInterval } from 'store/actions'; @@ -42,9 +45,12 @@ import { GlobalReducer } from 'types/reducer/globalTime'; import AutoRefresh from '../AutoRefreshV2'; import { DateTimeRangeType } from '../CustomDateTimeModal'; import { + convertOldTimeToNewValidCustomTimeFormat, + CustomTimeType, getDefaultOption, getOptions, LocalStorageTimeRange, + OLD_RELATIVE_TIME_VALUES, Time, TimeRange, } from './config'; @@ -66,6 +72,10 @@ function DateTimeSelection({ const searchStartTime = urlQuery.get('startTime'); const searchEndTime = urlQuery.get('endTime'); const queryClient = useQueryClient(); + const [enableAbsoluteTime, setEnableAbsoluteTime] = useState(false); + const [isValidteRelativeTime, setIsValidteRelativeTime] = useState(false); + const [, handleCopyToClipboard] = useCopyToClipboard(); + const [isURLCopied, setIsURLCopied] = useState(false); const { localstorageStartTime, @@ -178,7 +188,7 @@ function DateTimeSelection({ const getInputLabel = ( startTime?: Dayjs, endTime?: Dayjs, - timeInterval: Time = '15min', + timeInterval: Time | CustomTimeType = '15m', ): string | Time => { if (startTime && endTime && timeInterval === 'custom') { const format = 'DD/MM/YYYY HH:mm'; @@ -284,28 +294,38 @@ function DateTimeSelection({ [location.pathname], ); - const onSelectHandler = (value: Time): void => { + const onSelectHandler = (value: Time | CustomTimeType): void => { if (value !== 'custom') { setIsOpen(false); updateTimeInterval(value); updateLocalStorageForRoutes(value); + setIsValidteRelativeTime(true); if (refreshButtonHidden) { setRefreshButtonHidden(false); } } else { setRefreshButtonHidden(true); setCustomDTPickerVisible(true); + setIsValidteRelativeTime(false); + setEnableAbsoluteTime(false); + + return; } const { maxTime, minTime } = GetMinMax(value, getTime()); if (!isLogsExplorerPage) { - urlQuery.set(QueryParams.startTime, minTime.toString()); - urlQuery.set(QueryParams.endTime, maxTime.toString()); + urlQuery.delete('startTime'); + urlQuery.delete('endTime'); + + urlQuery.set(QueryParams.relativeTime, value); + const generatedUrl = `${location.pathname}?${urlQuery.toString()}`; history.replace(generatedUrl); } + // For logs explorer - time range handling is managed in useCopyLogLink.ts:52 + if (!stagedQuery) { return; } @@ -319,18 +339,22 @@ function DateTimeSelection({ }; const onCustomDateHandler = (dateTimeRange: DateTimeRangeType): void => { + // console.log('dateTimeRange', dateTimeRange); if (dateTimeRange !== null) { const [startTimeMoment, endTimeMoment] = dateTimeRange; if (startTimeMoment && endTimeMoment) { const startTime = startTimeMoment; const endTime = endTimeMoment; setCustomDTPickerVisible(false); + updateTimeInterval('custom', [ startTime.toDate().getTime(), endTime.toDate().getTime(), ]); + setLocalStorageKey('startTime', startTime.toString()); setLocalStorageKey('endTime', endTime.toString()); + updateLocalStorageForRoutes(JSON.stringify({ startTime, endTime })); if (!isLogsExplorerPage) { @@ -339,6 +363,7 @@ function DateTimeSelection({ startTime?.toDate().getTime().toString(), ); urlQuery.set(QueryParams.endTime, endTime?.toDate().getTime().toString()); + urlQuery.delete(QueryParams.relativeTime); const generatedUrl = `${location.pathname}?${urlQuery.toString()}`; history.replace(generatedUrl); } @@ -346,6 +371,57 @@ function DateTimeSelection({ } }; + const onValidCustomDateHandler = (dateTimeStr: CustomTimeType): void => { + setIsOpen(false); + updateTimeInterval(dateTimeStr); + updateLocalStorageForRoutes(dateTimeStr); + + urlQuery.delete('startTime'); + urlQuery.delete('endTime'); + + setIsValidteRelativeTime(true); + + const { maxTime, minTime } = GetMinMax(dateTimeStr, getTime()); + + if (!isLogsExplorerPage) { + urlQuery.delete('startTime'); + urlQuery.delete('endTime'); + + urlQuery.set(QueryParams.relativeTime, dateTimeStr); + + const generatedUrl = `${location.pathname}?${urlQuery.toString()}`; + history.replace(generatedUrl); + } + + if (!stagedQuery) { + return; + } + + // the second boolean param directs the qb about the time change so to merge the query and retain the current state + initQueryBuilderData(updateStepInterval(stagedQuery, maxTime, minTime), true); + }; + + const getCustomOrIntervalTime = ( + time: Time, + currentRoute: string, + ): Time | CustomTimeType => { + if (searchEndTime !== null && searchStartTime !== null) { + return 'custom'; + } + if ( + (localstorageEndTime === null || localstorageStartTime === null) && + time === 'custom' + ) { + return getDefaultOption(currentRoute); + } + + if (OLD_RELATIVE_TIME_VALUES.indexOf(time) > -1) { + return convertOldTimeToNewValidCustomTimeFormat(time); + } + + return time; + }; + // this is triggred when we change the routes and based on that we are changing the default options useEffect(() => { const metricsTimeDuration = getLocalStorageKey( @@ -365,21 +441,9 @@ function DateTimeSelection({ const currentOptions = getOptions(currentRoute); setOptions(currentOptions); - const getCustomOrIntervalTime = (time: Time): Time => { - if (searchEndTime !== null && searchStartTime !== null) { - return 'custom'; - } - if ( - (localstorageEndTime === null || localstorageStartTime === null) && - time === 'custom' - ) { - return getDefaultOption(currentRoute); - } + const updatedTime = getCustomOrIntervalTime(time, currentRoute); - return time; - }; - - const updatedTime = getCustomOrIntervalTime(time); + setIsValidteRelativeTime(updatedTime !== 'custom'); const [preStartTime = 0, preEndTime = 0] = getTime() || []; @@ -388,18 +452,113 @@ function DateTimeSelection({ updateTimeInterval(updatedTime, [preStartTime, preEndTime]); if (updatedTime !== 'custom') { - const { minTime, maxTime } = GetMinMax(updatedTime); - urlQuery.set(QueryParams.startTime, minTime.toString()); - urlQuery.set(QueryParams.endTime, maxTime.toString()); + urlQuery.delete('startTime'); + urlQuery.delete('endTime'); + + urlQuery.set(QueryParams.relativeTime, updatedTime); } else { - urlQuery.set(QueryParams.startTime, preStartTime.toString()); - urlQuery.set(QueryParams.endTime, preEndTime.toString()); + const startTime = preStartTime.toString(); + const endTime = preEndTime.toString(); + + urlQuery.set(QueryParams.startTime, startTime); + urlQuery.set(QueryParams.endTime, endTime); } + const generatedUrl = `${location.pathname}?${urlQuery.toString()}`; + history.replace(generatedUrl); // 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} + + +
+
+ ); + }; + return (
{!hasSelectedTimeError && !refreshButtonHidden && ( @@ -426,9 +585,12 @@ function DateTimeSelection({ setHasSelectedTimeError(hasError); }} selectedTime={selectedTime} - onValidCustomDateChange={(dateTime): void => - onCustomDateHandler(dateTime as DateTimeRangeType) - } + onValidCustomDateChange={(dateTime): void => { + onValidCustomDateHandler(dateTime.timeStr as CustomTimeType); + }} + onCustomTimeStatusUpdate={(isValid: boolean): void => { + setIsValidteRelativeTime(isValid); + }} selectedValue={getInputLabel( dayjs(minTime / 1000000), dayjs(maxTime / 1000000), @@ -457,6 +619,22 @@ function DateTimeSelection({
)} + + + + @@ -468,7 +646,7 @@ interface DateTimeSelectionV2Props { } interface DispatchProps { updateTimeInterval: ( - interval: Time, + interval: Time | CustomTimeType, dateTimeRange?: [number, number], ) => (dispatch: Dispatch) => void; globalTimeLoading: () => void; diff --git a/frontend/src/hooks/logs/useCopyLogLink.ts b/frontend/src/hooks/logs/useCopyLogLink.ts index b663aa750c63..8dee58c710bc 100644 --- a/frontend/src/hooks/logs/useCopyLogLink.ts +++ b/frontend/src/hooks/logs/useCopyLogLink.ts @@ -11,8 +11,11 @@ import { useMemo, useState, } from 'react'; +import { useSelector } from 'react-redux'; import { useLocation } from 'react-router-dom'; import { useCopyToClipboard } from 'react-use'; +import { AppState } from 'store/reducers'; +import { GlobalReducer } from 'types/reducer/globalTime'; import { HIGHLIGHTED_DELAY } from './configs'; import { LogTimeRange, UseCopyLogLink } from './types'; @@ -33,15 +36,30 @@ export const useCopyLogLink = (logId?: string): UseCopyLogLink => { null, ); + const { selectedTime } = useSelector( + (state) => state.globalTime, + ); + const onTimeRangeChange = useCallback( (newTimeRange: LogTimeRange | null): void => { urlQuery.set(QueryParams.timeRange, JSON.stringify(newTimeRange)); - urlQuery.set(QueryParams.startTime, newTimeRange?.start.toString() || ''); - urlQuery.set(QueryParams.endTime, newTimeRange?.end.toString() || ''); + + if (selectedTime !== 'custom') { + urlQuery.delete(QueryParams.startTime); + urlQuery.delete(QueryParams.endTime); + + urlQuery.set(QueryParams.relativeTime, selectedTime); + } else { + urlQuery.set(QueryParams.startTime, newTimeRange?.start.toString() || ''); + urlQuery.set(QueryParams.endTime, newTimeRange?.end.toString() || ''); + + urlQuery.delete(QueryParams.relativeTime); + } + const generatedUrl = `${pathname}?${urlQuery.toString()}`; history.replace(generatedUrl); }, - [pathname, urlQuery], + [pathname, urlQuery, selectedTime], ); const isActiveLog = useMemo(() => activeLogId === logId, [activeLogId, logId]); diff --git a/frontend/src/hooks/useQueryService.ts b/frontend/src/hooks/useQueryService.ts index c13654c56b67..a5c54f246660 100644 --- a/frontend/src/hooks/useQueryService.ts +++ b/frontend/src/hooks/useQueryService.ts @@ -1,7 +1,10 @@ import getService from 'api/metrics/getService'; import { AxiosError } from 'axios'; import { Time } from 'container/TopNav/DateTimeSelection/config'; -import { Time as TimeV2 } from 'container/TopNav/DateTimeSelectionV2/config'; +import { + CustomTimeType, + Time as TimeV2, +} from 'container/TopNav/DateTimeSelectionV2/config'; import { QueryKey, useQuery, @@ -27,7 +30,7 @@ export const useQueryService = ({ interface UseQueryServiceProps { minTime: number; maxTime: number; - selectedTime: Time | TimeV2; + selectedTime: Time | TimeV2 | CustomTimeType; selectedTags: Tags[]; options?: UseQueryOptions; } diff --git a/frontend/src/lib/dashboard/getQueryResults.ts b/frontend/src/lib/dashboard/getQueryResults.ts index 64b749e45c4f..177ae9311ba1 100644 --- a/frontend/src/lib/dashboard/getQueryResults.ts +++ b/frontend/src/lib/dashboard/getQueryResults.ts @@ -6,7 +6,10 @@ import { getMetricsQueryRange } from 'api/metrics/getQueryRange'; import { PANEL_TYPES } from 'constants/queryBuilder'; import { timePreferenceType } from 'container/NewWidget/RightContainer/timeItems'; import { Time } from 'container/TopNav/DateTimeSelection/config'; -import { Time as TimeV2 } from 'container/TopNav/DateTimeSelectionV2/config'; +import { + CustomTimeType, + Time as TimeV2, +} from 'container/TopNav/DateTimeSelectionV2/config'; import { Pagination } from 'hooks/queryPagination'; import { convertNewDataToOld } from 'lib/newQueryBuilder/convertNewDataToOld'; import { isEmpty } from 'lodash-es'; @@ -67,7 +70,7 @@ export interface GetQueryResultsProps { query: Query; graphType: PANEL_TYPES; selectedTime: timePreferenceType; - globalSelectedInterval: Time | TimeV2; + globalSelectedInterval: Time | TimeV2 | CustomTimeType; variables?: Record; params?: Record; tableParams?: { diff --git a/frontend/src/lib/getMinMax.ts b/frontend/src/lib/getMinMax.ts index c52436063db9..4a5076b06627 100644 --- a/frontend/src/lib/getMinMax.ts +++ b/frontend/src/lib/getMinMax.ts @@ -1,63 +1,101 @@ import { Time } from 'container/TopNav/DateTimeSelection/config'; import { Time as TimeV2 } from 'container/TopNav/DateTimeSelectionV2/config'; +import { isString } from 'lodash-es'; import { GlobalReducer } from 'types/reducer/globalTime'; import getMinAgo from './getStartAndEndTime/getMinAgo'; +const validCustomTimeRegex = /^(\d+)([mhdw])$/; + +export const isValidTimeFormat = (time: string): boolean => + validCustomTimeRegex.test(time); + +const extractTimeAndUnit = (time: string): { time: number; unit: string } => { + // Match the pattern + const match = /^(\d+)([mhdw])$/.exec(time); + + if (match) { + return { time: parseInt(match[1], 10), unit: match[2] }; + } + + return { + time: 30, + unit: 'm', + }; +}; + +export const getMinTimeForRelativeTimes = ( + time: number, + unit: string, +): number => { + switch (unit) { + case 'm': + return getMinAgo({ minutes: 1 * time }).getTime(); + case 'h': + return getMinAgo({ minutes: 60 * time }).getTime(); + case 'd': + return getMinAgo({ minutes: 24 * 60 * time }).getTime(); + case 'w': + return getMinAgo({ minutes: 24 * 60 * 7 * time }).getTime(); + default: + return getMinAgo({ minutes: 1 }).getTime(); + } +}; + const GetMinMax = ( - interval: Time | TimeV2, + interval: Time | TimeV2 | string, dateTimeRange?: [number, number], // eslint-disable-next-line sonarjs/cognitive-complexity ): GetMinMaxPayload => { let maxTime = new Date().getTime(); let minTime = 0; - if (interval === '1min') { + if (interval === '1m') { const minTimeAgo = getMinAgo({ minutes: 1 }).getTime(); minTime = minTimeAgo; - } else if (interval === '10min') { + } else if (interval === '10m') { const minTimeAgo = getMinAgo({ minutes: 10 }).getTime(); minTime = minTimeAgo; - } else if (interval === '15min') { + } else if (interval === '15m') { const minTimeAgo = getMinAgo({ minutes: 15 }).getTime(); minTime = minTimeAgo; - } else if (interval === '1hr') { + } else if (interval === '1h') { const minTimeAgo = getMinAgo({ minutes: 60 }).getTime(); minTime = minTimeAgo; - } else if (interval === '30min') { + } else if (interval === '30m') { const minTimeAgo = getMinAgo({ minutes: 30 }).getTime(); minTime = minTimeAgo; - } else if (interval === '45min') { + } else if (interval === '45m') { const minTimeAgo = getMinAgo({ minutes: 45 }).getTime(); minTime = minTimeAgo; - } else if (interval === '5min') { + } else if (interval === '5m') { const minTimeAgo = getMinAgo({ minutes: 5 }).getTime(); minTime = minTimeAgo; - } else if (interval === '1day') { + } else if (interval === '1d') { // one day = 24*60(min) const minTimeAgo = getMinAgo({ minutes: 24 * 60 }).getTime(); minTime = minTimeAgo; - } else if (interval === '3days') { + } else if (interval === '3d') { // three day = one day * 3 const minTimeAgo = getMinAgo({ minutes: 24 * 60 * 3 }).getTime(); minTime = minTimeAgo; - } else if (interval === '4days') { + } else if (interval === '4d') { // four day = one day * 4 const minTimeAgo = getMinAgo({ minutes: 24 * 60 * 4 }).getTime(); minTime = minTimeAgo; - } else if (interval === '10days') { + } else if (interval === '10d') { // ten day = one day * 10 const minTimeAgo = getMinAgo({ minutes: 24 * 60 * 10 }).getTime(); minTime = minTimeAgo; - } else if (interval === '1week') { + } else if (interval === '1w') { // one week = one day * 7 const minTimeAgo = getMinAgo({ minutes: 24 * 60 * 7 }).getTime(); minTime = minTimeAgo; - } else if (interval === '2weeks') { + } else if (interval === '2w') { // two week = one day * 14 const minTimeAgo = getMinAgo({ minutes: 24 * 60 * 14 }).getTime(); minTime = minTimeAgo; - } else if (interval === '6weeks') { + } else if (interval === '6w') { // six week = one day * 42 const minTimeAgo = getMinAgo({ minutes: 24 * 60 * 42 }).getTime(); minTime = minTimeAgo; @@ -65,13 +103,17 @@ const GetMinMax = ( // two months = one day * 60 const minTimeAgo = getMinAgo({ minutes: 24 * 60 * 60 }).getTime(); minTime = minTimeAgo; - } else if (['3hr', '4hr', '6hr', '12hr'].includes(interval)) { - const h = parseInt(interval.replace('hr', ''), 10); + } else if (['3h', '4h', '6h', '12h'].includes(interval)) { + const h = parseInt(interval.replace('h', ''), 10); const minTimeAgo = getMinAgo({ minutes: h * 60 }).getTime(); minTime = minTimeAgo; } else if (interval === 'custom') { maxTime = (dateTimeRange || [])[1] || 0; minTime = (dateTimeRange || [])[0] || 0; + } else if (isString(interval) && isValidTimeFormat(interval)) { + const { time, unit } = extractTimeAndUnit(interval); + + minTime = getMinTimeForRelativeTimes(time, unit); } else { throw new Error('invalid time type'); } diff --git a/frontend/src/lib/getStartEndRangeTime.ts b/frontend/src/lib/getStartEndRangeTime.ts index 7fd087fd54fa..37e057b7891a 100644 --- a/frontend/src/lib/getStartEndRangeTime.ts +++ b/frontend/src/lib/getStartEndRangeTime.ts @@ -1,7 +1,10 @@ import { PANEL_TYPES } from 'constants/queryBuilder'; import { timePreferenceType } from 'container/NewWidget/RightContainer/timeItems'; import { Time } from 'container/TopNav/DateTimeSelection/config'; -import { Time as TimeV2 } from 'container/TopNav/DateTimeSelectionV2/config'; +import { + CustomTimeType, + Time as TimeV2, +} from 'container/TopNav/DateTimeSelectionV2/config'; import store from 'store'; import getMaxMinTime from './getMaxMinTime'; @@ -38,7 +41,7 @@ const getStartEndRangeTime = ({ interface GetStartEndRangeTimesProps { type?: timePreferenceType; graphType?: PANEL_TYPES | null; - interval?: Time | TimeV2; + interval?: Time | TimeV2 | CustomTimeType; } interface GetStartEndRangeTimesPayload { diff --git a/frontend/src/store/actions/global.ts b/frontend/src/store/actions/global.ts index 19c3be2b7b55..149572d7264a 100644 --- a/frontend/src/store/actions/global.ts +++ b/frontend/src/store/actions/global.ts @@ -1,12 +1,15 @@ import { Time } from 'container/TopNav/DateTimeSelection/config'; -import { Time as TimeV2 } from 'container/TopNav/DateTimeSelectionV2/config'; +import { + CustomTimeType, + Time as TimeV2, +} from 'container/TopNav/DateTimeSelectionV2/config'; import GetMinMax from 'lib/getMinMax'; import { Dispatch } from 'redux'; import AppActions from 'types/actions'; import { UPDATE_TIME_INTERVAL } from 'types/actions/globalTime'; export const UpdateTimeInterval = ( - interval: Time | TimeV2, + interval: Time | TimeV2 | CustomTimeType, dateTimeRange: [number, number] = [0, 0], ): ((dispatch: Dispatch) => void) => ( dispatch: Dispatch, diff --git a/frontend/src/store/actions/trace/util.ts b/frontend/src/store/actions/trace/util.ts index 54cd819da537..df2955bbb8fa 100644 --- a/frontend/src/store/actions/trace/util.ts +++ b/frontend/src/store/actions/trace/util.ts @@ -88,4 +88,7 @@ export const getFilter = (data: GetFilterPayload): TraceReducer['filter'] => { }; export const stripTimestampsFromQuery = (query: string): string => - query.replace(/(\?|&)startTime=\d+/, '').replace(/&endTime=\d+/, ''); + query + .replace(/(\?|&)startTime=\d+/, '') + .replace(/&endTime=\d+/, '') + .replace(/[?&]relativeTime=[^&]+/g, ''); diff --git a/frontend/src/types/actions/globalTime.ts b/frontend/src/types/actions/globalTime.ts index 858a7c78a0d5..02243b7e0516 100644 --- a/frontend/src/types/actions/globalTime.ts +++ b/frontend/src/types/actions/globalTime.ts @@ -1,5 +1,8 @@ import { Time } from 'container/TopNav/DateTimeSelection/config'; -import { Time as TimeV2 } from 'container/TopNav/DateTimeSelectionV2/config'; +import { + CustomTimeType, + Time as TimeV2, +} from 'container/TopNav/DateTimeSelectionV2/config'; import { ResetIdStartAndEnd, SetSearchQueryString } from './logs'; @@ -14,7 +17,7 @@ export type GlobalTime = { }; interface UpdateTime extends GlobalTime { - selectedTime: Time | TimeV2; + selectedTime: Time | TimeV2 | CustomTimeType; } interface UpdateTimeInterval { diff --git a/frontend/src/types/reducer/globalTime.ts b/frontend/src/types/reducer/globalTime.ts index cd7fac1ea8ea..bc5e4e2d67d2 100644 --- a/frontend/src/types/reducer/globalTime.ts +++ b/frontend/src/types/reducer/globalTime.ts @@ -1,12 +1,15 @@ import { Time } from 'container/TopNav/DateTimeSelection/config'; -import { Time as TimeV2 } from 'container/TopNav/DateTimeSelectionV2/config'; +import { + CustomTimeType, + Time as TimeV2, +} from 'container/TopNav/DateTimeSelectionV2/config'; import { GlobalTime } from 'types/actions/globalTime'; export interface GlobalReducer { maxTime: GlobalTime['maxTime']; minTime: GlobalTime['minTime']; loading: boolean; - selectedTime: Time | TimeV2; + selectedTime: Time | TimeV2 | CustomTimeType; isAutoRefreshDisabled: boolean; selectedAutoRefreshInterval: string; } From 43ceb052d8647f75012cc90fc4d2cc6b4f3c635d Mon Sep 17 00:00:00 2001 From: Vikrant Gupta Date: Fri, 29 Mar 2024 16:00:22 +0530 Subject: [PATCH 12/68] feat: do not retry query range API's with i/o timeout error (#4768) * feat: do not retry query range API's with i/o timeout error * feat: do not retry query range API's with i/o timeout error --- frontend/src/api/ErrorResponseHandler.ts | 3 ++- .../src/container/GridCardLayout/GridCard/index.tsx | 10 ++++++++++ frontend/src/lib/dashboard/getQueryResults.ts | 2 +- frontend/src/types/api/index.ts | 3 ++- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/frontend/src/api/ErrorResponseHandler.ts b/frontend/src/api/ErrorResponseHandler.ts index 3f28ff418dbe..027418ec8457 100644 --- a/frontend/src/api/ErrorResponseHandler.ts +++ b/frontend/src/api/ErrorResponseHandler.ts @@ -30,7 +30,8 @@ export function ErrorResponseHandler(error: AxiosError): ErrorResponse { statusCode, payload: null, error: errorMessage, - message: null, + message: (response.data as any)?.status, + body: JSON.stringify((response.data as any).data), }; } diff --git a/frontend/src/container/GridCardLayout/GridCard/index.tsx b/frontend/src/container/GridCardLayout/GridCard/index.tsx index 1633f0b947e2..d81e5182220d 100644 --- a/frontend/src/container/GridCardLayout/GridCard/index.tsx +++ b/frontend/src/container/GridCardLayout/GridCard/index.tsx @@ -152,6 +152,16 @@ function GridCardGraph({ widget?.panelTypes, widget.timePreferance, ], + retry(failureCount, error): boolean { + if ( + String(error).includes('status: error') && + String(error).includes('i/o timeout') + ) { + return false; + } + + return failureCount < 2; + }, keepPreviousData: true, enabled: queryEnabledCondition, refetchOnMount: false, diff --git a/frontend/src/lib/dashboard/getQueryResults.ts b/frontend/src/lib/dashboard/getQueryResults.ts index 177ae9311ba1..0290a574cde5 100644 --- a/frontend/src/lib/dashboard/getQueryResults.ts +++ b/frontend/src/lib/dashboard/getQueryResults.ts @@ -34,7 +34,7 @@ export async function GetMetricQueryRange( if (response.statusCode >= 400) { throw new Error( - `API responded with ${response.statusCode} - ${response.error}`, + `API responded with ${response.statusCode} - ${response.error} status: ${response.message}, errors: ${response?.body}`, ); } diff --git a/frontend/src/types/api/index.ts b/frontend/src/types/api/index.ts index 49fdb21a4e25..b7a0ed57e409 100644 --- a/frontend/src/types/api/index.ts +++ b/frontend/src/types/api/index.ts @@ -6,7 +6,8 @@ export interface ErrorResponse { statusCode: ErrorStatusCode; payload: null; error: string; - message: null; + message: string | null; + body?: string | null; } export interface SuccessResponse { From 397da5857f2076bda25e79ddc0fbf1791f57790b Mon Sep 17 00:00:00 2001 From: Nityananda Gohain Date: Sat, 30 Mar 2024 08:55:46 +0530 Subject: [PATCH 13/68] fix: enrich all queries with non materialized attributes (#4772) --- pkg/query-service/app/logs/v3/enrich_query.go | 6 ++++++ pkg/query-service/app/logs/v3/enrich_query_test.go | 13 +++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/pkg/query-service/app/logs/v3/enrich_query.go b/pkg/query-service/app/logs/v3/enrich_query.go index c8a5a797b288..904b34899950 100644 --- a/pkg/query-service/app/logs/v3/enrich_query.go +++ b/pkg/query-service/app/logs/v3/enrich_query.go @@ -74,6 +74,12 @@ func isEnriched(field v3.AttributeKey) bool { if field.Type == v3.AttributeKeyTypeUnspecified || field.DataType == v3.AttributeKeyDataTypeUnspecified { return false } + + // try to enrich all attributes which doesn't have isColumn = true + if !field.IsColumn { + return false + } + return true } diff --git a/pkg/query-service/app/logs/v3/enrich_query_test.go b/pkg/query-service/app/logs/v3/enrich_query_test.go index 4903139610b2..3605fa540827 100644 --- a/pkg/query-service/app/logs/v3/enrich_query_test.go +++ b/pkg/query-service/app/logs/v3/enrich_query_test.go @@ -30,7 +30,7 @@ var testEnrichmentRequiredData = []struct { }, }, }, - EnrichmentRequired: false, + EnrichmentRequired: true, }, { Name: "attribute enrichment required", @@ -66,7 +66,7 @@ var testEnrichmentRequiredData = []struct { }, }, }, - EnrichmentRequired: false, + EnrichmentRequired: true, }, { Name: "filter enrichment required", @@ -118,7 +118,7 @@ var testEnrichmentRequiredData = []struct { }, }, }, - EnrichmentRequired: false, + EnrichmentRequired: true, }, { Name: "groupBy enrichment required", @@ -151,7 +151,7 @@ var testEnrichmentRequiredData = []struct { }, }, }, - EnrichmentRequired: false, + EnrichmentRequired: true, }, { Name: "orderBy enrichment required", @@ -200,7 +200,7 @@ var testEnrichmentRequiredData = []struct { }, }, }, - EnrichmentRequired: false, + EnrichmentRequired: true, }, } @@ -255,6 +255,7 @@ var testEnrichParamsData = []struct { Key: "response_time", Type: v3.AttributeKeyTypeTag, DataType: v3.AttributeKeyDataTypeInt64, + IsColumn: true, }, }, Result: v3.QueryRangeParamsV3{ @@ -273,7 +274,7 @@ var testEnrichParamsData = []struct { {Key: v3.AttributeKey{Key: "user_name", Type: v3.AttributeKeyTypeTag, DataType: v3.AttributeKeyDataTypeString}, Value: "john", Operator: "="}, }}, GroupBy: []v3.AttributeKey{{Key: "trace_id", Type: v3.AttributeKeyTypeUnspecified, DataType: v3.AttributeKeyDataTypeString, IsColumn: true}}, - OrderBy: []v3.OrderBy{{ColumnName: "response_time", Key: "response_time", Type: v3.AttributeKeyTypeTag, DataType: v3.AttributeKeyDataTypeInt64}}, + OrderBy: []v3.OrderBy{{ColumnName: "response_time", Key: "response_time", Type: v3.AttributeKeyTypeTag, DataType: v3.AttributeKeyDataTypeInt64, IsColumn: true}}, }, }, }, From a34c59762b9cce4e02610a1fc5145b2c789546bf Mon Sep 17 00:00:00 2001 From: Nityananda Gohain Date: Sat, 30 Mar 2024 17:57:01 +0530 Subject: [PATCH 14/68] feat: allow characters in attribute names (#4775) --- .../app/clickhouseReader/reader.go | 18 +++--- pkg/query-service/app/logs/parser_test.go | 10 ++-- .../app/logs/v3/query_builder.go | 4 +- .../app/logs/v3/query_builder_test.go | 55 ++++++++++--------- .../app/queryBuilder/query_builder_test.go | 8 +-- pkg/query-service/utils/format.go | 2 +- 6 files changed, 51 insertions(+), 46 deletions(-) diff --git a/pkg/query-service/app/clickhouseReader/reader.go b/pkg/query-service/app/clickhouseReader/reader.go index 1f5b2c2eb5a5..57d7318ee485 100644 --- a/pkg/query-service/app/clickhouseReader/reader.go +++ b/pkg/query-service/app/clickhouseReader/reader.go @@ -3674,7 +3674,7 @@ func isSelectedField(tableStatement string, field model.LogField) bool { // in case of attributes and resources, if there is a materialized column present then it is selected // TODO: handle partial change complete eg:- index is removed but materialized column is still present name := utils.GetClickhouseColumnName(field.Type, field.DataType, field.Name) - return strings.Contains(tableStatement, fmt.Sprintf("`%s`", name)) + return strings.Contains(tableStatement, fmt.Sprintf("%s", name)) } func (r *ClickHouseReader) UpdateLogField(ctx context.Context, field *model.UpdateField) *model.ApiError { @@ -3708,10 +3708,10 @@ func (r *ClickHouseReader) UpdateLogField(ctx context.Context, field *model.Upda return &model.ApiError{Err: err, Typ: model.ErrorInternal} } - query = fmt.Sprintf("ALTER TABLE %s.%s ON CLUSTER %s ADD COLUMN IF NOT EXISTS %s_exists bool DEFAULT if(indexOf(%s, '%s') != 0, true, false) CODEC(ZSTD(1))", + query = fmt.Sprintf("ALTER TABLE %s.%s ON CLUSTER %s ADD COLUMN IF NOT EXISTS %s_exists` bool DEFAULT if(indexOf(%s, '%s') != 0, true, false) CODEC(ZSTD(1))", r.logsDB, table, r.cluster, - colname, + strings.TrimSuffix(colname, "`"), keyColName, field.Name, ) @@ -3733,10 +3733,10 @@ func (r *ClickHouseReader) UpdateLogField(ctx context.Context, field *model.Upda if field.IndexGranularity == 0 { field.IndexGranularity = constants.DefaultLogSkipIndexGranularity } - query := fmt.Sprintf("ALTER TABLE %s.%s ON CLUSTER %s ADD INDEX IF NOT EXISTS %s_idx (%s) TYPE %s GRANULARITY %d", + query := fmt.Sprintf("ALTER TABLE %s.%s ON CLUSTER %s ADD INDEX IF NOT EXISTS %s_idx` (%s) TYPE %s GRANULARITY %d", r.logsDB, r.logsLocalTable, r.cluster, - colname, + strings.TrimSuffix(colname, "`"), colname, field.IndexType, field.IndexGranularity, @@ -3748,7 +3748,7 @@ func (r *ClickHouseReader) UpdateLogField(ctx context.Context, field *model.Upda } else { // Delete the index first - query := fmt.Sprintf("ALTER TABLE %s.%s ON CLUSTER %s DROP INDEX IF EXISTS %s_idx", r.logsDB, r.logsLocalTable, r.cluster, colname) + query := fmt.Sprintf("ALTER TABLE %s.%s ON CLUSTER %s DROP INDEX IF EXISTS %s_idx`", r.logsDB, r.logsLocalTable, r.cluster, strings.TrimSuffix(colname, "`")) err := r.db.Exec(ctx, query) if err != nil { return &model.ApiError{Err: err, Typ: model.ErrorInternal} @@ -3768,11 +3768,11 @@ func (r *ClickHouseReader) UpdateLogField(ctx context.Context, field *model.Upda } // drop exists column on logs table - query = "ALTER TABLE %s.%s ON CLUSTER %s DROP COLUMN IF EXISTS %s_exists " + query = "ALTER TABLE %s.%s ON CLUSTER %s DROP COLUMN IF EXISTS %s_exists` " err = r.db.Exec(ctx, fmt.Sprintf(query, r.logsDB, table, r.cluster, - colname, + strings.TrimSuffix(colname, "`"), ), ) if err != nil { @@ -4329,7 +4329,7 @@ func isColumn(tableStatement, attrType, field, datType string) bool { // value of attrType will be `resource` or `tag`, if `tag` change it to `attribute` name := utils.GetClickhouseColumnName(attrType, datType, field) - return strings.Contains(tableStatement, fmt.Sprintf("`%s` ", name)) + return strings.Contains(tableStatement, fmt.Sprintf("%s ", name)) } func (r *ClickHouseReader) GetLogAggregateAttributes(ctx context.Context, req *v3.AggregateAttributeRequest) (*v3.AggregateAttributeResponse, error) { diff --git a/pkg/query-service/app/logs/parser_test.go b/pkg/query-service/app/logs/parser_test.go index b02284ea0553..bb7dde629606 100644 --- a/pkg/query-service/app/logs/parser_test.go +++ b/pkg/query-service/app/logs/parser_test.go @@ -252,7 +252,7 @@ func TestReplaceInterestingFields(t *testing.T) { }, } - expectedTokens := []string{"attributes_int64_value[indexOf(attributes_int64_key, 'id.userid')] IN (100) ", "and attribute_int64_id_key >= 50 ", `AND body ILIKE '%searchstring%'`} + expectedTokens := []string{"attributes_int64_value[indexOf(attributes_int64_key, 'id.userid')] IN (100) ", "and `attribute_int64_id_key` >= 50 ", `AND body ILIKE '%searchstring%'`} Convey("testInterestingFields", t, func() { tokens, err := replaceInterestingFields(&allFields, queryTokens) So(err, ShouldBeNil) @@ -374,7 +374,7 @@ var generateSQLQueryTestCases = []struct { IdGt: "2BsKLKv8cZrLCn6rkOcRGkdjBdM", IdLT: "2BsKG6tRpFWjYMcWsAGKfSxoQdU", }, - SqlFilter: "( timestamp >= '1657689292000' and timestamp <= '1657689294000' and id > '2BsKLKv8cZrLCn6rkOcRGkdjBdM' and id < '2BsKG6tRpFWjYMcWsAGKfSxoQdU' ) and ( attribute_int64_field1 < 100 and attribute_int64_field1 > 50 and attributes_int64_value[indexOf(attributes_int64_key, 'code')] <= 500 and attributes_int64_value[indexOf(attributes_int64_key, 'code')] >= 400 ) ", + SqlFilter: "( timestamp >= '1657689292000' and timestamp <= '1657689294000' and id > '2BsKLKv8cZrLCn6rkOcRGkdjBdM' and id < '2BsKG6tRpFWjYMcWsAGKfSxoQdU' ) and ( `attribute_int64_field1` < 100 and `attribute_int64_field1` > 50 and attributes_int64_value[indexOf(attributes_int64_key, 'code')] <= 500 and attributes_int64_value[indexOf(attributes_int64_key, 'code')] >= 400 ) ", }, { Name: "second query with only timestamp range", @@ -383,7 +383,7 @@ var generateSQLQueryTestCases = []struct { TimestampStart: uint64(1657689292000), TimestampEnd: uint64(1657689294000), }, - SqlFilter: "( timestamp >= '1657689292000' and timestamp <= '1657689294000' ) and ( attribute_int64_field1 < 100 and attribute_int64_field1 > 50 and attributes_int64_value[indexOf(attributes_int64_key, 'code')] <= 500 and attributes_int64_value[indexOf(attributes_int64_key, 'code')] >= 400 ) ", + SqlFilter: "( timestamp >= '1657689292000' and timestamp <= '1657689294000' ) and ( `attribute_int64_field1` < 100 and `attribute_int64_field1` > 50 and attributes_int64_value[indexOf(attributes_int64_key, 'code')] <= 500 and attributes_int64_value[indexOf(attributes_int64_key, 'code')] >= 400 ) ", }, { Name: "generate case sensitive query", @@ -392,7 +392,7 @@ var generateSQLQueryTestCases = []struct { TimestampStart: uint64(1657689292000), TimestampEnd: uint64(1657689294000), }, - SqlFilter: "( timestamp >= '1657689292000' and timestamp <= '1657689294000' ) and ( attribute_int64_field1 < 100 and attributes_int64_value[indexOf(attributes_int64_key, 'FielD1')] > 50 and attribute_double64_Field2 > 10 and attributes_int64_value[indexOf(attributes_int64_key, 'code')] <= 500 and attributes_int64_value[indexOf(attributes_int64_key, 'code')] >= 400 ) ", + SqlFilter: "( timestamp >= '1657689292000' and timestamp <= '1657689294000' ) and ( `attribute_int64_field1` < 100 and attributes_int64_value[indexOf(attributes_int64_key, 'FielD1')] > 50 and `attribute_double64_Field2` > 10 and attributes_int64_value[indexOf(attributes_int64_key, 'code')] <= 500 and attributes_int64_value[indexOf(attributes_int64_key, 'code')] >= 400 ) ", }, { Name: "Check exists and not exists", @@ -401,7 +401,7 @@ var generateSQLQueryTestCases = []struct { TimestampStart: uint64(1657689292000), TimestampEnd: uint64(1657689294000), }, - SqlFilter: "( timestamp >= '1657689292000' and timestamp <= '1657689294000' ) and ( has(attributes_int64_key, 'field1') and NOT has(attributes_double64_key, 'Field2') and attribute_double64_Field2 > 10 ) ", + SqlFilter: "( timestamp >= '1657689292000' and timestamp <= '1657689294000' ) and ( has(attributes_int64_key, 'field1') and NOT has(attributes_double64_key, 'Field2') and `attribute_double64_Field2` > 10 ) ", }, { Name: "Check top level key filter", diff --git a/pkg/query-service/app/logs/v3/query_builder.go b/pkg/query-service/app/logs/v3/query_builder.go index 7babe2cd0de2..e01cb95d7497 100644 --- a/pkg/query-service/app/logs/v3/query_builder.go +++ b/pkg/query-service/app/logs/v3/query_builder.go @@ -150,7 +150,7 @@ func GetExistsNexistsFilter(op v3.FilterOperator, item v3.FilterItem) string { if op == v3.FilterOperatorNotExists { val = false } - return fmt.Sprintf("%s_exists=%v", getClickhouseColumnName(item.Key), val) + return fmt.Sprintf("%s_exists`=%v", strings.TrimSuffix(getClickhouseColumnName(item.Key), "`"), val) } columnType := getClickhouseLogsColumnType(item.Key.Type) columnDataType := getClickhouseLogsColumnDataType(item.Key.DataType) @@ -212,7 +212,7 @@ func buildLogsTimeSeriesFilterQuery(fs *v3.FilterSet, groupBy []v3.AttributeKey, conditions = append(conditions, fmt.Sprintf("has(%s_%s_key, '%s')", columnType, columnDataType, attr.Key)) } else if attr.Type != v3.AttributeKeyTypeUnspecified { // for materialzied columns - conditions = append(conditions, fmt.Sprintf("%s_exists=true", getClickhouseColumnName(attr))) + conditions = append(conditions, fmt.Sprintf("%s_exists`=true", strings.TrimSuffix(getClickhouseColumnName(attr), "`"))) } } diff --git a/pkg/query-service/app/logs/v3/query_builder_test.go b/pkg/query-service/app/logs/v3/query_builder_test.go index d8c5a141b268..58a120cd44a1 100644 --- a/pkg/query-service/app/logs/v3/query_builder_test.go +++ b/pkg/query-service/app/logs/v3/query_builder_test.go @@ -26,17 +26,17 @@ var testGetClickhouseColumnNameData = []struct { { Name: "selected field", AttributeKey: v3.AttributeKey{Key: "servicename", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag, IsColumn: true}, - ExpectedColumnName: "attribute_string_servicename", + ExpectedColumnName: "`attribute_string_servicename`", }, { Name: "selected field resource", AttributeKey: v3.AttributeKey{Key: "sdk_version", DataType: v3.AttributeKeyDataTypeInt64, Type: v3.AttributeKeyTypeResource, IsColumn: true}, - ExpectedColumnName: "resource_int64_sdk_version", + ExpectedColumnName: "`resource_int64_sdk_version`", }, { Name: "selected field float", AttributeKey: v3.AttributeKey{Key: "sdk_version", DataType: v3.AttributeKeyDataTypeFloat64, Type: v3.AttributeKeyTypeTag, IsColumn: true}, - ExpectedColumnName: "attribute_float64_sdk_version", + ExpectedColumnName: "`attribute_float64_sdk_version`", }, { Name: "same name as top level column", @@ -48,6 +48,11 @@ var testGetClickhouseColumnNameData = []struct { AttributeKey: v3.AttributeKey{Key: "trace_id", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeUnspecified, IsColumn: true}, ExpectedColumnName: "trace_id", }, + { + Name: "name with - ", + AttributeKey: v3.AttributeKey{Key: "test-attr", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag, IsColumn: true}, + ExpectedColumnName: "`attribute_string_test-attr`", + }, } func TestGetClickhouseColumnName(t *testing.T) { @@ -131,7 +136,7 @@ var timeSeriesFilterQueryData = []struct { {Key: v3.AttributeKey{Key: "user_name", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag, IsColumn: true}, Value: "john", Operator: "="}, {Key: v3.AttributeKey{Key: "k8s_namespace", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeResource}, Value: "my_service", Operator: "!="}, }}, - ExpectedFilter: "attribute_string_user_name = 'john' AND resources_string_value[indexOf(resources_string_key, 'k8s_namespace')] != 'my_service'", + ExpectedFilter: "`attribute_string_user_name` = 'john' AND resources_string_value[indexOf(resources_string_key, 'k8s_namespace')] != 'my_service'", }, { Name: "Test like", @@ -194,7 +199,7 @@ var timeSeriesFilterQueryData = []struct { FilterSet: &v3.FilterSet{Operator: "AND", Items: []v3.FilterItem{ {Key: v3.AttributeKey{Key: "host", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag, IsColumn: true}, Value: "host: \"(?P\\S+)\"", Operator: "regex"}, }}, - ExpectedFilter: "match(attribute_string_host, 'host: \"(?P\\\\S+)\"')", + ExpectedFilter: "match(`attribute_string_host`, 'host: \"(?P\\\\S+)\"')", }, { Name: "Test not regex", @@ -217,7 +222,7 @@ var timeSeriesFilterQueryData = []struct { {Key: v3.AttributeKey{Key: "host", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag}, Value: "102.", Operator: "ncontains"}, }}, GroupBy: []v3.AttributeKey{{Key: "host", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag, IsColumn: true}}, - ExpectedFilter: "attributes_string_value[indexOf(attributes_string_key, 'host')] NOT ILIKE '%102.%' AND attribute_string_host_exists=true", + ExpectedFilter: "attributes_string_value[indexOf(attributes_string_key, 'host')] NOT ILIKE '%102.%' AND `attribute_string_host_exists`=true", }, { Name: "Wrong data", @@ -266,14 +271,14 @@ var timeSeriesFilterQueryData = []struct { FilterSet: &v3.FilterSet{Operator: "AND", Items: []v3.FilterItem{ {Key: v3.AttributeKey{Key: "method", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag, IsColumn: true}, Operator: "exists"}, }}, - ExpectedFilter: "attribute_string_method_exists=true", + ExpectedFilter: "`attribute_string_method_exists`=true", }, { Name: "Test nexists on materiazlied column", FilterSet: &v3.FilterSet{Operator: "AND", Items: []v3.FilterItem{ {Key: v3.AttributeKey{Key: "status", DataType: v3.AttributeKeyDataTypeInt64, Type: v3.AttributeKeyTypeTag, IsColumn: true}, Operator: "nexists"}, }}, - ExpectedFilter: "attribute_int64_status_exists=false", + ExpectedFilter: "`attribute_int64_status_exists`=false", }, // add new tests } @@ -368,7 +373,7 @@ var testBuildLogsQueryData = []struct { OrderBy: []v3.OrderBy{{ColumnName: "#SIGNOZ_VALUE", Order: "ASC"}}, }, TableName: "logs", - ExpectedQuery: "SELECT toStartOfInterval(fromUnixTimestamp64Nano(timestamp), INTERVAL 60 SECOND) AS ts, toFloat64(count(distinct(attribute_string_name))) as value from signoz_logs.distributed_logs where (timestamp >= 1680066360726210000 AND timestamp <= 1680066458000000000) AND attribute_string_name_exists=true group by ts order by value ASC", + ExpectedQuery: "SELECT toStartOfInterval(fromUnixTimestamp64Nano(timestamp), INTERVAL 60 SECOND) AS ts, toFloat64(count(distinct(`attribute_string_name`))) as value from signoz_logs.distributed_logs where (timestamp >= 1680066360726210000 AND timestamp <= 1680066458000000000) AND `attribute_string_name_exists`=true group by ts order by value ASC", }, { Name: "Test aggregate count distinct on non selected field", @@ -421,9 +426,9 @@ var testBuildLogsQueryData = []struct { }, TableName: "logs", - ExpectedQuery: "SELECT toStartOfInterval(fromUnixTimestamp64Nano(timestamp), INTERVAL 60 SECOND) AS ts, attribute_string_host$$name as `host.name`, toFloat64(count(distinct(attribute_string_method$$name))) as value" + + ExpectedQuery: "SELECT toStartOfInterval(fromUnixTimestamp64Nano(timestamp), INTERVAL 60 SECOND) AS ts, `attribute_string_host$$name` as `host.name`, toFloat64(count(distinct(`attribute_string_method$$name`))) as value" + " from signoz_logs.distributed_logs where (timestamp >= 1680066360726210000 AND timestamp <= 1680066458000000000) " + - "AND attribute_string_host$$name_exists=true AND attribute_string_method$$name_exists=true " + + "AND `attribute_string_host$$name_exists`=true AND `attribute_string_method$$name_exists`=true " + "group by `host.name`,ts " + "order by `host.name` ASC", }, @@ -449,11 +454,11 @@ var testBuildLogsQueryData = []struct { TableName: "logs", ExpectedQuery: "SELECT toStartOfInterval(fromUnixTimestamp64Nano(timestamp), INTERVAL 60 SECOND) AS ts," + " attributes_string_value[indexOf(attributes_string_key, 'method')] as `method`, " + - "toFloat64(count(distinct(attribute_string_name))) as value from signoz_logs.distributed_logs " + + "toFloat64(count(distinct(`attribute_string_name`))) as value from signoz_logs.distributed_logs " + "where (timestamp >= 1680066360726210000 AND timestamp <= 1680066458000000000) " + "AND attributes_string_value[indexOf(attributes_string_key, 'method')] = 'GET' AND resources_string_value[indexOf(resources_string_key, 'x')] != 'abc' " + "AND has(attributes_string_key, 'method') " + - "AND attribute_string_name_exists=true " + + "AND `attribute_string_name_exists`=true " + "group by `method`,ts " + "order by `method` ASC", }, @@ -480,12 +485,12 @@ var testBuildLogsQueryData = []struct { ExpectedQuery: "SELECT toStartOfInterval(fromUnixTimestamp64Nano(timestamp), INTERVAL 60 SECOND) AS ts," + " attributes_string_value[indexOf(attributes_string_key, 'method')] as `method`, " + "resources_string_value[indexOf(resources_string_key, 'x')] as `x`, " + - "toFloat64(count(distinct(attribute_string_name))) as value from signoz_logs.distributed_logs " + + "toFloat64(count(distinct(`attribute_string_name`))) as value from signoz_logs.distributed_logs " + "where (timestamp >= 1680066360726210000 AND timestamp <= 1680066458000000000) " + "AND attributes_string_value[indexOf(attributes_string_key, 'method')] = 'GET' AND resources_string_value[indexOf(resources_string_key, 'x')] != 'abc' " + "AND has(attributes_string_key, 'method') " + "AND has(resources_string_key, 'x') " + - "AND attribute_string_name_exists=true " + + "AND `attribute_string_name_exists`=true " + "group by `method`,`x`,ts " + "order by `method` ASC,`x` ASC", }, @@ -540,12 +545,12 @@ var testBuildLogsQueryData = []struct { TableName: "logs", ExpectedQuery: "SELECT toStartOfInterval(fromUnixTimestamp64Nano(timestamp), INTERVAL 60 SECOND) AS ts," + " attributes_string_value[indexOf(attributes_string_key, 'method')] as `method`, " + - "sum(attribute_float64_bytes) as value " + + "sum(`attribute_float64_bytes`) as value " + "from signoz_logs.distributed_logs " + "where (timestamp >= 1680066360726210000 AND timestamp <= 1680066458000000000) " + "AND attributes_string_value[indexOf(attributes_string_key, 'method')] = 'GET' " + "AND has(attributes_string_key, 'method') " + - "AND attribute_float64_bytes_exists=true " + + "AND `attribute_float64_bytes_exists`=true " + "group by `method`,ts " + "order by `method` ASC", }, @@ -570,12 +575,12 @@ var testBuildLogsQueryData = []struct { TableName: "logs", ExpectedQuery: "SELECT toStartOfInterval(fromUnixTimestamp64Nano(timestamp), INTERVAL 60 SECOND) AS ts," + " attributes_string_value[indexOf(attributes_string_key, 'method')] as `method`, " + - "min(attribute_float64_bytes) as value " + + "min(`attribute_float64_bytes`) as value " + "from signoz_logs.distributed_logs " + "where (timestamp >= 1680066360726210000 AND timestamp <= 1680066458000000000) " + "AND attributes_string_value[indexOf(attributes_string_key, 'method')] = 'GET' " + "AND has(attributes_string_key, 'method') " + - "AND attribute_float64_bytes_exists=true " + + "AND `attribute_float64_bytes_exists`=true " + "group by `method`,ts " + "order by `method` ASC", }, @@ -600,12 +605,12 @@ var testBuildLogsQueryData = []struct { TableName: "logs", ExpectedQuery: "SELECT toStartOfInterval(fromUnixTimestamp64Nano(timestamp), INTERVAL 60 SECOND) AS ts," + " attributes_string_value[indexOf(attributes_string_key, 'method')] as `method`, " + - "max(attribute_float64_bytes) as value " + + "max(`attribute_float64_bytes`) as value " + "from signoz_logs.distributed_logs " + "where (timestamp >= 1680066360726210000 AND timestamp <= 1680066458000000000) " + "AND attributes_string_value[indexOf(attributes_string_key, 'method')] = 'GET' " + "AND has(attributes_string_key, 'method') " + - "AND attribute_float64_bytes_exists=true " + + "AND `attribute_float64_bytes_exists`=true " + "group by `method`,ts " + "order by `method` ASC", }, @@ -627,11 +632,11 @@ var testBuildLogsQueryData = []struct { TableName: "logs", ExpectedQuery: "SELECT toStartOfInterval(fromUnixTimestamp64Nano(timestamp), INTERVAL 60 SECOND) AS ts," + " attributes_string_value[indexOf(attributes_string_key, 'method')] as `method`, " + - "quantile(0.05)(attribute_float64_bytes) as value " + + "quantile(0.05)(`attribute_float64_bytes`) as value " + "from signoz_logs.distributed_logs " + "where (timestamp >= 1680066360726210000 AND timestamp <= 1680066458000000000) " + "AND has(attributes_string_key, 'method') " + - "AND attribute_float64_bytes_exists=true " + + "AND `attribute_float64_bytes_exists`=true " + "group by `method`,ts " + "order by `method` ASC", }, @@ -653,10 +658,10 @@ var testBuildLogsQueryData = []struct { TableName: "logs", PreferRPM: true, ExpectedQuery: "SELECT toStartOfInterval(fromUnixTimestamp64Nano(timestamp), INTERVAL 60 SECOND) AS ts, attributes_string_value[indexOf(attributes_string_key, 'method')] as `method`" + - ", sum(attribute_float64_bytes)/1.000000 as value from signoz_logs.distributed_logs " + + ", sum(`attribute_float64_bytes`)/1.000000 as value from signoz_logs.distributed_logs " + "where (timestamp >= 1680066360726210000 AND timestamp <= 1680066458000000000) " + "AND has(attributes_string_key, 'method') " + - "AND attribute_float64_bytes_exists=true " + + "AND `attribute_float64_bytes_exists`=true " + "group by `method`,ts order by `method` ASC", }, { diff --git a/pkg/query-service/app/queryBuilder/query_builder_test.go b/pkg/query-service/app/queryBuilder/query_builder_test.go index 3cec2f301e64..65fe21e1d723 100644 --- a/pkg/query-service/app/queryBuilder/query_builder_test.go +++ b/pkg/query-service/app/queryBuilder/query_builder_test.go @@ -554,10 +554,10 @@ var testLogsWithFormula = []struct { }, }, ExpectedQuery: "SELECT A.`key1.1` as `key1.1`, A.`ts` as `ts`, A.value - B.value as value FROM (SELECT toStartOfInterval(fromUnixTimestamp64Nano(timestamp), INTERVAL 60 SECOND) AS ts, " + - "attribute_bool_key1$$1 as `key1.1`, toFloat64(count(*)) as value from signoz_logs.distributed_logs where (timestamp >= 1702980884000000000 AND timestamp <= 1702984484000000000) AND " + - "attribute_bool_key_2 = true AND attribute_bool_key1$$1_exists=true group by `key1.1`,ts order by value DESC) as A INNER JOIN (SELECT toStartOfInterval(fromUnixTimestamp64Nano(timestamp), " + - "INTERVAL 60 SECOND) AS ts, attribute_bool_key1$$1 as `key1.1`, toFloat64(count(*)) as value from signoz_logs.distributed_logs where (timestamp >= 1702980884000000000 AND " + - "timestamp <= 1702984484000000000) AND attributes_bool_value[indexOf(attributes_bool_key, 'key_1')] = true AND attribute_bool_key1$$1_exists=true group by `key1.1`,ts order by value DESC) as B " + + "`attribute_bool_key1$$1` as `key1.1`, toFloat64(count(*)) as value from signoz_logs.distributed_logs where (timestamp >= 1702980884000000000 AND timestamp <= 1702984484000000000) AND " + + "`attribute_bool_key_2` = true AND `attribute_bool_key1$$1_exists`=true group by `key1.1`,ts order by value DESC) as A INNER JOIN (SELECT toStartOfInterval(fromUnixTimestamp64Nano(timestamp), " + + "INTERVAL 60 SECOND) AS ts, `attribute_bool_key1$$1` as `key1.1`, toFloat64(count(*)) as value from signoz_logs.distributed_logs where (timestamp >= 1702980884000000000 AND " + + "timestamp <= 1702984484000000000) AND attributes_bool_value[indexOf(attributes_bool_key, 'key_1')] = true AND `attribute_bool_key1$$1_exists`=true group by `key1.1`,ts order by value DESC) as B " + "ON A.`key1.1` = B.`key1.1` AND A.`ts` = B.`ts`", }, } diff --git a/pkg/query-service/utils/format.go b/pkg/query-service/utils/format.go index 0a614e298742..aa9fc59720be 100644 --- a/pkg/query-service/utils/format.go +++ b/pkg/query-service/utils/format.go @@ -243,7 +243,7 @@ func GetClickhouseColumnName(typeName string, dataType, field string) string { // if name contains . replace it with `$$` field = strings.ReplaceAll(field, ".", "$$") - colName := fmt.Sprintf("%s_%s_%s", strings.ToLower(typeName), strings.ToLower(dataType), field) + colName := fmt.Sprintf("`%s_%s_%s`", strings.ToLower(typeName), strings.ToLower(dataType), field) return colName } From 39e0ef68ca9dbdf94845ff5ae106dea23cc85461 Mon Sep 17 00:00:00 2001 From: Raj Kamal Singh <1133322+raj-k-singh@users.noreply.github.com> Date: Mon, 1 Apr 2024 12:06:08 +0530 Subject: [PATCH 15/68] chore: integration instructions: add typical log file locations on macOS (#4779) --- .../builtin_integrations/mongo/config/collect-logs.md | 4 +++- .../builtin_integrations/nginx/config/collect-logs.md | 4 +++- .../builtin_integrations/postgres/config/collect-logs.md | 4 +++- .../builtin_integrations/redis/config/collect-logs.md | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/pkg/query-service/app/integrations/builtin_integrations/mongo/config/collect-logs.md b/pkg/query-service/app/integrations/builtin_integrations/mongo/config/collect-logs.md index fa55ca9a63fc..86255f0df4df 100644 --- a/pkg/query-service/app/integrations/builtin_integrations/mongo/config/collect-logs.md +++ b/pkg/query-service/app/integrations/builtin_integrations/mongo/config/collect-logs.md @@ -97,7 +97,9 @@ Set the following environment variables in your otel-collector environment: ```bash # path of MongoDB server log file. must be accessible by the otel collector -export MONGODB_LOG_FILE=/var/log/mongodb.log +# typically found in /usr/local/var/log/mongodb on macOS +# mongod.conf file can also be checked for finding log file location +export MONGODB_LOG_FILE=/var/log/mongodb/mongodb.log # region specific SigNoz cloud ingestion endpoint export OTLP_DESTINATION_ENDPOINT="ingest.us.signoz.cloud:443" diff --git a/pkg/query-service/app/integrations/builtin_integrations/nginx/config/collect-logs.md b/pkg/query-service/app/integrations/builtin_integrations/nginx/config/collect-logs.md index b421478ab901..71712c503be1 100644 --- a/pkg/query-service/app/integrations/builtin_integrations/nginx/config/collect-logs.md +++ b/pkg/query-service/app/integrations/builtin_integrations/nginx/config/collect-logs.md @@ -117,9 +117,11 @@ Set the following environment variables in your otel-collector environment: ```bash # path of Nginx access log file. must be accessible by the otel collector -export NGINX_ACCESS_LOG_FILE=/var/log/nginx/access.log; +# typically found at /usr/local/var/log/nginx/access.log on macOS +export NGINX_ACCESS_LOG_FILE=/var/log/nginx/access.log # path of Nginx error log file. must be accessible by the otel collector +# typically found at /usr/local/var/log/nginx/error.log on macOS export NGINX_ERROR_LOG_FILE=/var/log/nginx/error.log # region specific SigNoz cloud ingestion endpoint diff --git a/pkg/query-service/app/integrations/builtin_integrations/postgres/config/collect-logs.md b/pkg/query-service/app/integrations/builtin_integrations/postgres/config/collect-logs.md index 0c199061a7d7..9f20655cc34f 100644 --- a/pkg/query-service/app/integrations/builtin_integrations/postgres/config/collect-logs.md +++ b/pkg/query-service/app/integrations/builtin_integrations/postgres/config/collect-logs.md @@ -91,7 +91,9 @@ Set the following environment variables in your otel-collector environment: ```bash # path of Postgres server log file. must be accessible by the otel collector -export POSTGRESQL_LOG_FILE=/usr/local/var/log/postgres.log +# typically found in /usr/local/var/log/postgresql on macOS +# running `SELECT pg_current_logfile();` can also give you the location of postgresql log file +export POSTGRESQL_LOG_FILE=/var/log/postgresql/postgresql.log # region specific SigNoz cloud ingestion endpoint export OTLP_DESTINATION_ENDPOINT="ingest.us.signoz.cloud:443" diff --git a/pkg/query-service/app/integrations/builtin_integrations/redis/config/collect-logs.md b/pkg/query-service/app/integrations/builtin_integrations/redis/config/collect-logs.md index e8b26ef710e5..0b8e697b13d3 100644 --- a/pkg/query-service/app/integrations/builtin_integrations/redis/config/collect-logs.md +++ b/pkg/query-service/app/integrations/builtin_integrations/redis/config/collect-logs.md @@ -82,7 +82,9 @@ Set the following environment variables in your otel-collector environment: ```bash # path of Redis server log file. must be accessible by the otel collector -export REDIS_LOG_FILE=/var/log/redis.log +# typically found in /usr/local/var/log/redis on macOS +# log file location can also be found in the output of `redis-cli CONFIG GET : *` +export REDIS_LOG_FILE=/var/log/redis/redis-server.log # region specific SigNoz cloud ingestion endpoint export OTLP_DESTINATION_ENDPOINT="ingest.us.signoz.cloud:443" From 00d74bfebb83428e973239f61422b8bc460c82f5 Mon Sep 17 00:00:00 2001 From: Vikrant Gupta Date: Mon, 1 Apr 2024 12:40:15 +0530 Subject: [PATCH 16/68] feat: add integrations to the side-nav for cloud users (#4756) * feat: add integrations to the side-nav for cloud users * feat: change the route from integrations/installed to /integrations * feat: light mode table color * feat: increase the width of the integrations panel by 25 percent * feat: added telemetry constants and page view * feat: added telemetry events for integrations * feat: address review comments --- frontend/public/locales/en/titles.json | 2 +- frontend/src/AppRoutes/pageComponents.ts | 8 ------- frontend/src/AppRoutes/routes.ts | 12 ++--------- frontend/src/constants/routes.ts | 4 +--- frontend/src/container/SideNav/SideNav.tsx | 11 ++++++++++ frontend/src/container/SideNav/menuItems.tsx | 12 +++++------ .../TopNav/DateTimeSelectionV2/config.ts | 4 +--- .../IntegrationDetailContent.tsx | 10 +++++++-- .../Configure.tsx | 20 ++++++++++++++++-- .../IntegrationDetailContentTabs.styles.scss | 4 ++-- .../IntegrationDetailHeader.tsx | 14 +++++++++++++ .../IntegrationDetailPage.tsx | 2 ++ .../IntegrationsUninstallBar.tsx | 21 ++++++++++++++++++- .../Integrations/Integrations.styles.scss | 2 +- .../src/pages/Integrations/Integrations.tsx | 16 ++++++++++++-- frontend/src/pages/Integrations/utils.ts | 12 +++++++++++ .../IntegrationsModulePage/constants.tsx | 4 ++-- frontend/src/utils/permission/index.ts | 4 +--- 18 files changed, 116 insertions(+), 46 deletions(-) diff --git a/frontend/public/locales/en/titles.json b/frontend/public/locales/en/titles.json index e707c998f7d1..8aef9c9af6cb 100644 --- a/frontend/public/locales/en/titles.json +++ b/frontend/public/locales/en/titles.json @@ -48,5 +48,5 @@ "TRACES_SAVE_VIEWS": "SigNoz | Traces Saved Views", "DEFAULT": "Open source Observability Platform | SigNoz", "SHORTCUTS": "SigNoz | Shortcuts", - "INTEGRATIONS_INSTALLED": "SigNoz | Integrations" + "INTEGRATIONS": "SigNoz | Integrations" } diff --git a/frontend/src/AppRoutes/pageComponents.ts b/frontend/src/AppRoutes/pageComponents.ts index bea07a7e51f1..1252496c08cf 100644 --- a/frontend/src/AppRoutes/pageComponents.ts +++ b/frontend/src/AppRoutes/pageComponents.ts @@ -197,11 +197,3 @@ export const InstalledIntegrations = Loadable( /* webpackChunkName: "InstalledIntegrations" */ 'pages/IntegrationsModulePage' ), ); - -export const IntegrationsMarketPlace = Loadable( - // eslint-disable-next-line sonarjs/no-identical-functions - () => - import( - /* webpackChunkName: "IntegrationsMarketPlace" */ 'pages/IntegrationsModulePage' - ), -); diff --git a/frontend/src/AppRoutes/routes.ts b/frontend/src/AppRoutes/routes.ts index 360c74d8dafe..fed77f186ef2 100644 --- a/frontend/src/AppRoutes/routes.ts +++ b/frontend/src/AppRoutes/routes.ts @@ -15,7 +15,6 @@ import { ErrorDetails, IngestionSettings, InstalledIntegrations, - IntegrationsMarketPlace, LicensePage, ListAllALertsPage, LiveLogs, @@ -338,18 +337,11 @@ const routes: AppRoutes[] = [ key: 'SHORTCUTS', }, { - path: ROUTES.INTEGRATIONS_INSTALLED, + path: ROUTES.INTEGRATIONS, exact: true, component: InstalledIntegrations, isPrivate: true, - key: 'INTEGRATIONS_INSTALLED', - }, - { - path: ROUTES.INTEGRATIONS_MARKETPLACE, - exact: true, - component: IntegrationsMarketPlace, - isPrivate: true, - key: 'INTEGRATIONS_MARKETPLACE', + key: 'INTEGRATIONS', }, ]; diff --git a/frontend/src/constants/routes.ts b/frontend/src/constants/routes.ts index 0b087ff8cd88..cbeb672a5cff 100644 --- a/frontend/src/constants/routes.ts +++ b/frontend/src/constants/routes.ts @@ -51,9 +51,7 @@ const ROUTES = { TRACES_SAVE_VIEWS: '/traces/saved-views', WORKSPACE_LOCKED: '/workspace-locked', SHORTCUTS: '/shortcuts', - INTEGRATIONS_BASE: '/integrations', - INTEGRATIONS_INSTALLED: '/integrations/installed', - INTEGRATIONS_MARKETPLACE: '/integrations/marketplace', + INTEGRATIONS: '/integrations', } as const; export default ROUTES; diff --git a/frontend/src/container/SideNav/SideNav.tsx b/frontend/src/container/SideNav/SideNav.tsx index 665a40671057..6b11ae140c60 100644 --- a/frontend/src/container/SideNav/SideNav.tsx +++ b/frontend/src/container/SideNav/SideNav.tsx @@ -271,6 +271,17 @@ function SideNav({ } }, [isCloudUserVal, isEnterprise, isFetching]); + useEffect(() => { + if (!isCloudUserVal) { + let updatedMenuItems = [...menuItems]; + updatedMenuItems = updatedMenuItems.filter( + (item) => item.key !== ROUTES.INTEGRATIONS, + ); + setMenuItems(updatedMenuItems); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + const [isCurrentOrgSettings] = useComponentPermission( ['current_org_settings'], role, diff --git a/frontend/src/container/SideNav/menuItems.tsx b/frontend/src/container/SideNav/menuItems.tsx index ed6f10b10a4a..38529a7f3b61 100644 --- a/frontend/src/container/SideNav/menuItems.tsx +++ b/frontend/src/container/SideNav/menuItems.tsx @@ -16,6 +16,7 @@ import { ScrollText, Settings, Slack, + Unplug, // Unplug, UserPlus, } from 'lucide-react'; @@ -90,11 +91,11 @@ const menuItems: SidebarItem[] = [ label: 'Alerts', icon: , }, - // { - // key: ROUTES.INTEGRATIONS_INSTALLED, - // label: 'Integrations', - // icon: , - // }, + { + key: ROUTES.INTEGRATIONS, + label: 'Integrations', + icon: , + }, { key: ROUTES.ALL_ERROR, label: 'Exceptions', @@ -127,7 +128,6 @@ export const NEW_ROUTES_MENU_ITEM_KEY_MAP: Record = { [ROUTES.TRACES_EXPLORER]: ROUTES.TRACE, [ROUTES.TRACE_EXPLORER]: ROUTES.TRACE, [ROUTES.LOGS_BASE]: ROUTES.LOGS_EXPLORER, - [ROUTES.INTEGRATIONS_BASE]: ROUTES.INTEGRATIONS_INSTALLED, }; export default menuItems; diff --git a/frontend/src/container/TopNav/DateTimeSelectionV2/config.ts b/frontend/src/container/TopNav/DateTimeSelectionV2/config.ts index f92beb6b8dc3..eefa31475cb6 100644 --- a/frontend/src/container/TopNav/DateTimeSelectionV2/config.ts +++ b/frontend/src/container/TopNav/DateTimeSelectionV2/config.ts @@ -199,9 +199,7 @@ export const routesToSkip = [ ROUTES.TRACES_EXPLORER, ROUTES.TRACES_SAVE_VIEWS, ROUTES.SHORTCUTS, - ROUTES.INTEGRATIONS_BASE, - ROUTES.INTEGRATIONS_INSTALLED, - ROUTES.INTEGRATIONS_MARKETPLACE, + ROUTES.INTEGRATIONS, ]; export const routesToDisable = [ROUTES.LOGS_EXPLORER, ROUTES.LIVE_LOGS]; diff --git a/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailContent.tsx b/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailContent.tsx index ec81d51db65b..c0b3a52f441c 100644 --- a/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailContent.tsx +++ b/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailContent.tsx @@ -12,12 +12,13 @@ import Overview from './IntegrationDetailContentTabs/Overview'; interface IntegrationDetailContentProps { activeDetailTab: string; integrationData: IntegrationDetailedProps; + integrationId: string; } function IntegrationDetailContent( props: IntegrationDetailContentProps, ): JSX.Element { - const { activeDetailTab, integrationData } = props; + const { activeDetailTab, integrationData, integrationId } = props; const items: TabsProps['items'] = [ { key: 'overview', @@ -49,7 +50,12 @@ function IntegrationDetailContent( Configure ), - children: , + children: ( + + ), }, { key: 'dataCollected', diff --git a/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailContentTabs/Configure.tsx b/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailContentTabs/Configure.tsx index 92a5e0c823e2..2984ba40fea1 100644 --- a/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailContentTabs/Configure.tsx +++ b/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailContentTabs/Configure.tsx @@ -3,20 +3,36 @@ import './IntegrationDetailContentTabs.styles.scss'; import { Button, Typography } from 'antd'; import cx from 'classnames'; import { MarkdownRenderer } from 'components/MarkdownRenderer/MarkdownRenderer'; -import { useState } from 'react'; +import useAnalytics from 'hooks/analytics/useAnalytics'; +import { INTEGRATION_TELEMETRY_EVENTS } from 'pages/Integrations/utils'; +import { useEffect, useState } from 'react'; interface ConfigurationProps { configuration: Array<{ title: string; instructions: string }>; + integrationId: string; } function Configure(props: ConfigurationProps): JSX.Element { // TODO Mardown renderer support once instructions are ready - const { configuration } = props; + const { configuration, integrationId } = props; const [selectedConfigStep, setSelectedConfigStep] = useState(0); const handleMenuClick = (index: number): void => { setSelectedConfigStep(index); }; + + const { trackEvent } = useAnalytics(); + + useEffect(() => { + trackEvent( + INTEGRATION_TELEMETRY_EVENTS.INTEGRATIONS_DETAIL_CONFIGURE_INSTRUCTION, + { + integration: integrationId, + }, + ); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + return (
diff --git a/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailContentTabs/IntegrationDetailContentTabs.styles.scss b/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailContentTabs/IntegrationDetailContentTabs.styles.scss index 81dcb6bf59d3..bf542f539d81 100644 --- a/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailContentTabs/IntegrationDetailContentTabs.styles.scss +++ b/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailContentTabs/IntegrationDetailContentTabs.styles.scss @@ -260,7 +260,7 @@ .logs-section { .table-row-dark { - background: rgba(255, 255, 255, 0.01); + background: var(--bg-vanilla-300); } .logs-section-table { @@ -271,7 +271,7 @@ .metrics-section { .table-row-dark { - background: rgba(255, 255, 255, 0.01); + background: var(--bg-vanilla-300); } .metrics-section-table { diff --git a/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailHeader.tsx b/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailHeader.tsx index cab49391f5a6..f630f3ecc47c 100644 --- a/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailHeader.tsx +++ b/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailHeader.tsx @@ -5,12 +5,14 @@ import { Button, Modal, Tooltip, Typography } from 'antd'; import installIntegration from 'api/Integrations/installIntegration'; import { SOMETHING_WENT_WRONG } from 'constants/api'; import dayjs from 'dayjs'; +import useAnalytics from 'hooks/analytics/useAnalytics'; import { useNotifications } from 'hooks/useNotifications'; import { ArrowLeftRight, Check } from 'lucide-react'; import { useState } from 'react'; import { useMutation } from 'react-query'; import { IntegrationConnectionStatus } from 'types/api/integrations/types'; +import { INTEGRATION_TELEMETRY_EVENTS } from '../utils'; import TestConnection, { ConnectionStates } from './TestConnection'; interface IntegrationDetailHeaderProps { @@ -37,6 +39,8 @@ function IntegrationDetailHeader( } = props; const [isModalOpen, setIsModalOpen] = useState(false); + const { trackEvent } = useAnalytics(); + const { notifications } = useNotifications(); const showModal = (): void => { @@ -120,8 +124,18 @@ function IntegrationDetailHeader( disabled={isInstallLoading} onClick={(): void => { if (connectionState === ConnectionStates.NotInstalled) { + trackEvent(INTEGRATION_TELEMETRY_EVENTS.INTEGRATIONS_DETAIL_CONNECT, { + integration: id, + }); mutate({ integration_id: id, config: {} }); } else { + trackEvent( + INTEGRATION_TELEMETRY_EVENTS.INTEGRATIONS_DETAIL_TEST_CONNECTION, + { + integration: id, + connectionStatus: connectionState, + }, + ); showModal(); } }} diff --git a/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailPage.tsx b/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailPage.tsx index 88be0dc3a340..a0e97dfe1c5b 100644 --- a/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailPage.tsx +++ b/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailPage.tsx @@ -123,6 +123,7 @@ function IntegrationDetailPage(props: IntegrationDetailPageProps): JSX.Element { {connectionStatus !== ConnectionStates.NotInstalled && ( @@ -130,6 +131,7 @@ function IntegrationDetailPage(props: IntegrationDetailPageProps): JSX.Element { integrationTitle={defaultTo(integrationData?.title, '')} integrationId={selectedIntegration} refetchIntegrationDetails={refetch} + connectionStatus={connectionStatus} /> )} diff --git a/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationsUninstallBar.tsx b/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationsUninstallBar.tsx index 41e985abf80b..a1ad762ec634 100644 --- a/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationsUninstallBar.tsx +++ b/frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationsUninstallBar.tsx @@ -3,23 +3,35 @@ import './IntegrationDetailPage.styles.scss'; import { Button, Modal, Typography } from 'antd'; import unInstallIntegration from 'api/Integrations/uninstallIntegration'; import { SOMETHING_WENT_WRONG } from 'constants/api'; +import useAnalytics from 'hooks/analytics/useAnalytics'; import { useNotifications } from 'hooks/useNotifications'; import { X } from 'lucide-react'; import { useState } from 'react'; import { useMutation } from 'react-query'; +import { INTEGRATION_TELEMETRY_EVENTS } from '../utils'; +import { ConnectionStates } from './TestConnection'; + interface IntergrationsUninstallBarProps { integrationTitle: string; integrationId: string; refetchIntegrationDetails: () => void; + connectionStatus: ConnectionStates; } function IntergrationsUninstallBar( props: IntergrationsUninstallBarProps, ): JSX.Element { - const { integrationTitle, integrationId, refetchIntegrationDetails } = props; + const { + integrationTitle, + integrationId, + refetchIntegrationDetails, + connectionStatus, + } = props; const { notifications } = useNotifications(); const [isModalOpen, setIsModalOpen] = useState(false); + const { trackEvent } = useAnalytics(); + const { mutate: uninstallIntegration, isLoading: isUninstallLoading, @@ -40,6 +52,13 @@ function IntergrationsUninstallBar( }; const handleOk = (): void => { + trackEvent( + INTEGRATION_TELEMETRY_EVENTS.INTEGRATIONS_DETAIL_REMOVE_INTEGRATION, + { + integration: integrationId, + integrationStatus: connectionStatus, + }, + ); uninstallIntegration({ integration_id: integrationId, }); diff --git a/frontend/src/pages/Integrations/Integrations.styles.scss b/frontend/src/pages/Integrations/Integrations.styles.scss index 794b5964075f..aec8433a266b 100644 --- a/frontend/src/pages/Integrations/Integrations.styles.scss +++ b/frontend/src/pages/Integrations/Integrations.styles.scss @@ -6,7 +6,7 @@ .integrations-content { width: calc(100% - 30px); - max-width: 736px; + max-width: 920px; .integrations-header { .title { diff --git a/frontend/src/pages/Integrations/Integrations.tsx b/frontend/src/pages/Integrations/Integrations.tsx index bda4184eabd6..1f1644fbc783 100644 --- a/frontend/src/pages/Integrations/Integrations.tsx +++ b/frontend/src/pages/Integrations/Integrations.tsx @@ -1,18 +1,22 @@ import './Integrations.styles.scss'; +import useAnalytics from 'hooks/analytics/useAnalytics'; import useUrlQuery from 'hooks/useUrlQuery'; -import { useCallback, useMemo, useState } from 'react'; +import { useCallback, useEffect, useMemo, useState } from 'react'; import { useHistory, useLocation } from 'react-router-dom'; import Header from './Header'; import IntegrationDetailPage from './IntegrationDetailPage/IntegrationDetailPage'; import IntegrationsList from './IntegrationsList'; +import { INTEGRATION_TELEMETRY_EVENTS } from './utils'; function Integrations(): JSX.Element { const urlQuery = useUrlQuery(); const history = useHistory(); const location = useLocation(); + const { trackPageView, trackEvent } = useAnalytics(); + const selectedIntegration = useMemo(() => urlQuery.get('integration'), [ urlQuery, ]); @@ -20,6 +24,9 @@ function Integrations(): JSX.Element { const setSelectedIntegration = useCallback( (integration: string | null) => { if (integration) { + trackEvent(INTEGRATION_TELEMETRY_EVENTS.INTEGRATIONS_ITEM_LIST_CLICKED, { + integration, + }); urlQuery.set('integration', integration); } else { urlQuery.set('integration', ''); @@ -27,13 +34,18 @@ function Integrations(): JSX.Element { const generatedUrl = `${location.pathname}?${urlQuery.toString()}`; history.push(generatedUrl); }, - [history, location.pathname, urlQuery], + [history, location.pathname, trackEvent, urlQuery], ); const [activeDetailTab, setActiveDetailTab] = useState( 'overview', ); + useEffect(() => { + trackPageView(location.pathname); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + const [searchTerm, setSearchTerm] = useState(''); return (
diff --git a/frontend/src/pages/Integrations/utils.ts b/frontend/src/pages/Integrations/utils.ts index 81c70b6091e3..a244da4c8221 100644 --- a/frontend/src/pages/Integrations/utils.ts +++ b/frontend/src/pages/Integrations/utils.ts @@ -7,3 +7,15 @@ export const handleContactSupport = (isCloudUser: boolean): void => { window.open('https://signoz.io/slack', '_blank'); } }; + +export const INTEGRATION_TELEMETRY_EVENTS = { + INTEGRATIONS_ITEM_LIST_CLICKED: 'Integrations Page: Clicked an integration', + INTEGRATIONS_DETAIL_CONNECT: + 'Integrations Detail Page: Clicked connect integration button', + INTEGRATIONS_DETAIL_TEST_CONNECTION: + 'Integrations Detail Page: Clicked test Connection button for integration', + INTEGRATIONS_DETAIL_REMOVE_INTEGRATION: + 'Integrations Detail Page: Clicked remove Integration button for integration', + INTEGRATIONS_DETAIL_CONFIGURE_INSTRUCTION: + 'Integrations Detail Page: Navigated to configure an integration', +}; diff --git a/frontend/src/pages/IntegrationsModulePage/constants.tsx b/frontend/src/pages/IntegrationsModulePage/constants.tsx index d0100798a8c1..333c9df44c7e 100644 --- a/frontend/src/pages/IntegrationsModulePage/constants.tsx +++ b/frontend/src/pages/IntegrationsModulePage/constants.tsx @@ -10,6 +10,6 @@ export const installedIntegrations: TabRoutes = { Integrations
), - route: ROUTES.INTEGRATIONS_INSTALLED, - key: ROUTES.INTEGRATIONS_INSTALLED, + route: ROUTES.INTEGRATIONS, + key: ROUTES.INTEGRATIONS, }; diff --git a/frontend/src/utils/permission/index.ts b/frontend/src/utils/permission/index.ts index b18be180cdbb..1c992965d481 100644 --- a/frontend/src/utils/permission/index.ts +++ b/frontend/src/utils/permission/index.ts @@ -96,7 +96,5 @@ export const routePermission: Record = { LOGS_BASE: [], OLD_LOGS_EXPLORER: [], SHORTCUTS: ['ADMIN', 'EDITOR', 'VIEWER'], - INTEGRATIONS_BASE: ['ADMIN', 'EDITOR', 'VIEWER'], - INTEGRATIONS_INSTALLED: ['ADMIN', 'EDITOR', 'VIEWER'], - INTEGRATIONS_MARKETPLACE: ['ADMIN', 'EDITOR', 'VIEWER'], + INTEGRATIONS: ['ADMIN', 'EDITOR', 'VIEWER'], }; From 51abe714216ed499ad2e025e01f5826d42e8d0e2 Mon Sep 17 00:00:00 2001 From: Vikrant Gupta Date: Mon, 1 Apr 2024 13:56:59 +0530 Subject: [PATCH 17/68] fix: do not move to next step if env not selected in onboarding (#4784) --- .../common/ModuleStepsContainer/ModuleStepsContainer.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/src/container/OnboardingContainer/common/ModuleStepsContainer/ModuleStepsContainer.tsx b/frontend/src/container/OnboardingContainer/common/ModuleStepsContainer/ModuleStepsContainer.tsx index 272d2b5083e5..662daedeaac5 100644 --- a/frontend/src/container/OnboardingContainer/common/ModuleStepsContainer/ModuleStepsContainer.tsx +++ b/frontend/src/container/OnboardingContainer/common/ModuleStepsContainer/ModuleStepsContainer.tsx @@ -16,7 +16,7 @@ import { DataSourceType } from 'container/OnboardingContainer/Steps/DataSource/D import { hasFrameworks } from 'container/OnboardingContainer/utils/dataSourceUtils'; import useAnalytics from 'hooks/analytics/useAnalytics'; import history from 'lib/history'; -import { isEmpty } from 'lodash-es'; +import { isEmpty, isNull } from 'lodash-es'; import { useState } from 'react'; import { useOnboardingContext } from '../../context/OnboardingContext'; @@ -91,7 +91,10 @@ export default function ModuleStepsContainer({ name: selectedDataSourceName = '', } = selectedDataSource as DataSourceType; - if (step.id === environmentDetailsStep && selectedEnvironment === '') { + if ( + step.id === environmentDetailsStep && + (selectedEnvironment === '' || isNull(selectedEnvironment)) + ) { updateErrorDetails('Please select environment'); return false; } From 5e0e9da6c4748080a838f3e4fca9ced152bf569f Mon Sep 17 00:00:00 2001 From: Nityananda Gohain Date: Mon, 1 Apr 2024 14:51:40 +0530 Subject: [PATCH 18/68] fix: hotfix bug in enhance query (#4783) --- pkg/query-service/app/logs/v3/enrich_query.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pkg/query-service/app/logs/v3/enrich_query.go b/pkg/query-service/app/logs/v3/enrich_query.go index 904b34899950..06445d164d30 100644 --- a/pkg/query-service/app/logs/v3/enrich_query.go +++ b/pkg/query-service/app/logs/v3/enrich_query.go @@ -153,9 +153,12 @@ func enrichFieldWithMetadata(field v3.AttributeKey, fields map[string]v3.Attribu return field } - // enrich with default values if metadata is not found - field.Type = v3.AttributeKeyTypeTag - field.DataType = v3.AttributeKeyDataTypeString + if field.Type == "" { + field.Type = v3.AttributeKeyTypeTag + } + if field.DataType == "" { + field.DataType = v3.AttributeKeyDataTypeString + } return field } From 8c02f8ec31a0cf08e64a178b4a05b77e51635a38 Mon Sep 17 00:00:00 2001 From: Vishal Sharma Date: Mon, 1 Apr 2024 15:06:38 +0530 Subject: [PATCH 19/68] chore: rate limit param (#4785) --- pkg/query-service/app/http_handler.go | 4 ++-- pkg/query-service/model/queryParams.go | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/query-service/app/http_handler.go b/pkg/query-service/app/http_handler.go index aab6cb339363..7f9e6795a77d 100644 --- a/pkg/query-service/app/http_handler.go +++ b/pkg/query-service/app/http_handler.go @@ -401,7 +401,7 @@ func (aH *APIHandler) RegisterRoutes(router *mux.Router, am *AuthMiddleware) { router.HandleFunc("/api/v1/explorer/views/{viewId}", am.EditAccess(aH.deleteSavedView)).Methods(http.MethodDelete) router.HandleFunc("/api/v1/feedback", am.OpenAccess(aH.submitFeedback)).Methods(http.MethodPost) - router.HandleFunc("/api/v1/events", am.ViewAccess(aH.registerEvent)).Methods(http.MethodPost) + router.HandleFunc("/api/v1/event", am.ViewAccess(aH.registerEvent)).Methods(http.MethodPost) // router.HandleFunc("/api/v1/get_percentiles", aH.getApplicationPercentiles).Methods(http.MethodGet) router.HandleFunc("/api/v1/services", am.ViewAccess(aH.getServices)).Methods(http.MethodPost) @@ -1516,7 +1516,7 @@ func (aH *APIHandler) registerEvent(w http.ResponseWriter, r *http.Request) { } userEmail, err := auth.GetEmailFromJwt(r.Context()) if err == nil { - telemetry.GetInstance().SendEvent(request.EventName, request.Attributes, userEmail, true, true) + telemetry.GetInstance().SendEvent(request.EventName, request.Attributes, userEmail, request.RateLimited, true) aH.WriteJSON(w, r, map[string]string{"data": "Event Processed Successfully"}) } else { RespondError(w, &model.ApiError{Typ: model.ErrorInternal, Err: err}, nil) diff --git a/pkg/query-service/model/queryParams.go b/pkg/query-service/model/queryParams.go index 11020a0abf05..4a24dba2b665 100644 --- a/pkg/query-service/model/queryParams.go +++ b/pkg/query-service/model/queryParams.go @@ -165,8 +165,9 @@ type GetTopOperationsParams struct { } type RegisterEventParams struct { - EventName string `json:"eventName"` - Attributes map[string]interface{} `json:"attributes"` + EventName string `json:"eventName"` + Attributes map[string]interface{} `json:"attributes"` + RateLimited bool `json:"rateLimited"` } type GetUsageParams struct { From 1610b95b84d1e1bef8a70a704a9e26d14fdb666f Mon Sep 17 00:00:00 2001 From: Yunus M Date: Mon, 1 Apr 2024 19:09:16 +0530 Subject: [PATCH 20/68] =?UTF-8?q?feat:=20onboarding=20flow=20-=20enable=20?= =?UTF-8?q?users=20to=20submit=20request=20for=20a=20new=20data=E2=80=A6?= =?UTF-8?q?=20(#4786)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: onboarding flow - enable users to submit request for a new data source , environment * chore: request data source to be available for all modules * chore: remove hardcoded value --- frontend/src/api/common/logEvent.ts | 28 +++ .../Onboarding.styles.scss | 21 +- .../Steps/DataSource/DataSource.styles.scss | 5 + .../Steps/DataSource/DataSource.tsx | 182 +++++++++++++----- .../EnvironmentDetails/EnvironmentDetails.tsx | 111 ++++++++++- frontend/src/periscope.scss | 5 + frontend/src/types/api/events/types.ts | 9 + frontend/src/typings/window.ts | 1 + 8 files changed, 311 insertions(+), 51 deletions(-) create mode 100644 frontend/src/api/common/logEvent.ts create mode 100644 frontend/src/types/api/events/types.ts diff --git a/frontend/src/api/common/logEvent.ts b/frontend/src/api/common/logEvent.ts new file mode 100644 index 000000000000..212d382d7765 --- /dev/null +++ b/frontend/src/api/common/logEvent.ts @@ -0,0 +1,28 @@ +import axios from 'api'; +import { ErrorResponseHandler } from 'api/ErrorResponseHandler'; +import { AxiosError } from 'axios'; +import { ErrorResponse, SuccessResponse } from 'types/api'; +import { EventSuccessPayloadProps } from 'types/api/events/types'; + +const logEvent = async ( + eventName: string, + attributes: Record, +): Promise | ErrorResponse> => { + try { + const response = await axios.post('/event', { + eventName, + attributes, + }); + + return { + statusCode: 200, + error: null, + message: response.data.status, + payload: response.data.data, + }; + } catch (error) { + return ErrorResponseHandler(error as AxiosError); + } +}; + +export default logEvent; diff --git a/frontend/src/container/OnboardingContainer/Onboarding.styles.scss b/frontend/src/container/OnboardingContainer/Onboarding.styles.scss index 4e00b629c891..018c9af35220 100644 --- a/frontend/src/container/OnboardingContainer/Onboarding.styles.scss +++ b/frontend/src/container/OnboardingContainer/Onboarding.styles.scss @@ -58,10 +58,15 @@ box-sizing: border-box; cursor: pointer; width: 400px; + transition: 0.3s; .ant-card-body { padding: 0px; } + + &:hover { + transform: scale(1.05); + } } .moduleTitleStyle { @@ -73,6 +78,7 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + text-align: center; } .moduleStyles.selected { @@ -107,8 +113,8 @@ .actionButtonsContainer { display: flex; - justify-content: space-between; align-items: center; + gap: 8px; box-sizing: border-box; align-items: center; } @@ -137,3 +143,16 @@ padding-left: 4px; } } + +.request-entity-container { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + + border-radius: 4px; + border: 0.5px solid rgba(78, 116, 248, 0.2); + background: rgba(69, 104, 220, 0.1); + padding: 12px; + margin: 24px 0; +} diff --git a/frontend/src/container/OnboardingContainer/Steps/DataSource/DataSource.styles.scss b/frontend/src/container/OnboardingContainer/Steps/DataSource/DataSource.styles.scss index a991bb216dfa..a3d8468559c1 100644 --- a/frontend/src/container/OnboardingContainer/Steps/DataSource/DataSource.styles.scss +++ b/frontend/src/container/OnboardingContainer/Steps/DataSource/DataSource.styles.scss @@ -22,6 +22,7 @@ div[class*='-setup-instructions-container'] { .form-container { display: flex; + flex-direction: column; align-items: flex-start; width: 100%; gap: 16px; @@ -36,3 +37,7 @@ div[class*='-setup-instructions-container'] { text-align: center; font-size: 12px; } + +.service-name-container { + width: 100%; +} diff --git a/frontend/src/container/OnboardingContainer/Steps/DataSource/DataSource.tsx b/frontend/src/container/OnboardingContainer/Steps/DataSource/DataSource.tsx index 13296671ecf2..5a06cdef94d8 100644 --- a/frontend/src/container/OnboardingContainer/Steps/DataSource/DataSource.tsx +++ b/frontend/src/container/OnboardingContainer/Steps/DataSource/DataSource.tsx @@ -2,7 +2,9 @@ /* eslint-disable jsx-a11y/click-events-have-key-events */ import './DataSource.styles.scss'; -import { Card, Form, Input, Select, Typography } from 'antd'; +import { LoadingOutlined } from '@ant-design/icons'; +import { Button, Card, Form, Input, Select, Space, Typography } from 'antd'; +import logEvent from 'api/common/logEvent'; import cx from 'classnames'; import { useOnboardingContext } from 'container/OnboardingContainer/context/OnboardingContext'; import { useCases } from 'container/OnboardingContainer/OnboardingContainer'; @@ -11,7 +13,10 @@ import { getSupportedFrameworks, hasFrameworks, } from 'container/OnboardingContainer/utils/dataSourceUtils'; +import { useNotifications } from 'hooks/useNotifications'; +import { Check } from 'lucide-react'; import { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { popupContainer } from 'utils/selectPopupContainer'; export interface DataSourceType { @@ -23,6 +28,7 @@ export interface DataSourceType { export default function DataSource(): JSX.Element { const [form] = Form.useForm(); + const { t } = useTranslation(['common']); const { serviceName, @@ -42,6 +48,15 @@ export default function DataSource(): JSX.Element { DataSourceType[] >([]); + const requestedDataSourceName = Form.useWatch('requestedDataSourceName', form); + + const [ + isSubmittingRequestForDataSource, + setIsSubmittingRequestForDataSource, + ] = useState(false); + + const { notifications } = useNotifications(); + const [enableFrameworks, setEnableFrameworks] = useState(false); useEffect(() => { @@ -74,12 +89,49 @@ export default function DataSource(): JSX.Element { } }, [selectedModule, selectedDataSource]); + const handleRequestDataSourceSubmit = async (): Promise => { + try { + setIsSubmittingRequestForDataSource(true); + const response = await logEvent('Onboarding V2: Data Source Requested', { + module: selectedModule?.id, + dataSource: requestedDataSourceName, + }); + + if (response.statusCode === 200) { + notifications.success({ + message: 'Data Source Request Submitted', + }); + + form.setFieldValue('requestedDataSourceName', ''); + + setIsSubmittingRequestForDataSource(false); + } else { + notifications.error({ + message: + response.error || + t('something_went_wrong', { + ns: 'common', + }), + }); + + setIsSubmittingRequestForDataSource(false); + } + } catch (error) { + notifications.error({ + message: t('something_went_wrong', { + ns: 'common', + }), + }); + + setIsSubmittingRequestForDataSource(false); + } + }; + return (
* Select Data Source -
{supportedDataSources?.map((dataSource) => ( - {selectedModule?.id === useCases.APM.id && ( -
-
-
{ - const serviceName = form.getFieldValue('serviceName'); +
+
+ { + const serviceName = form.getFieldValue('serviceName'); - updateServiceName(serviceName); - }} - name="data-source-form" - style={{ minWidth: '300px' }} - layout="vertical" - validateTrigger="onBlur" - > - - - + updateServiceName(serviceName); + }} + name="data-source-form" + layout="vertical" + validateTrigger="onBlur" + > + {selectedModule?.id === useCases.APM.id && ( + <> + + + - {enableFrameworks && ( -
+ {enableFrameworks && ( +
+ + updateSelectedFramework(value)} - options={supportedframeworks} - /> + -
- )} - -
+ + +
+
+
- )} +
); } diff --git a/frontend/src/container/OnboardingContainer/Steps/EnvironmentDetails/EnvironmentDetails.tsx b/frontend/src/container/OnboardingContainer/Steps/EnvironmentDetails/EnvironmentDetails.tsx index f4f8381de774..02fac551dfad 100644 --- a/frontend/src/container/OnboardingContainer/Steps/EnvironmentDetails/EnvironmentDetails.tsx +++ b/frontend/src/container/OnboardingContainer/Steps/EnvironmentDetails/EnvironmentDetails.tsx @@ -1,8 +1,13 @@ -import { Card, Typography } from 'antd'; +import { LoadingOutlined } from '@ant-design/icons'; +import { Button, Card, Form, Input, Space, Typography } from 'antd'; +import logEvent from 'api/common/logEvent'; import cx from 'classnames'; import { useOnboardingContext } from 'container/OnboardingContainer/context/OnboardingContext'; import { useCases } from 'container/OnboardingContainer/OnboardingContainer'; -import { Server } from 'lucide-react'; +import { useNotifications } from 'hooks/useNotifications'; +import { Check, Server } from 'lucide-react'; +import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; interface SupportedEnvironmentsProps { name: string; @@ -33,16 +38,78 @@ const supportedEnvironments: SupportedEnvironmentsProps[] = [ ]; export default function EnvironmentDetails(): JSX.Element { + const [form] = Form.useForm(); + const { t } = useTranslation(['common']); + const { selectedEnvironment, updateSelectedEnvironment, selectedModule, + selectedDataSource, + selectedFramework, errorDetails, updateErrorDetails, } = useOnboardingContext(); + const requestedEnvironmentName = Form.useWatch( + 'requestedEnvironmentName', + form, + ); + + const { notifications } = useNotifications(); + + const [ + isSubmittingRequestForEnvironment, + setIsSubmittingRequestForEnvironment, + ] = useState(false); + + const handleRequestedEnvironmentSubmit = async (): Promise => { + try { + setIsSubmittingRequestForEnvironment(true); + const response = await logEvent('Onboarding V2: Environment Requested', { + module: selectedModule?.id, + dataSource: selectedDataSource?.id, + framework: selectedFramework, + environment: requestedEnvironmentName, + }); + + if (response.statusCode === 200) { + notifications.success({ + message: 'Environment Request Submitted', + }); + + form.setFieldValue('requestedEnvironmentName', ''); + + setIsSubmittingRequestForEnvironment(false); + } else { + notifications.error({ + message: + response.error || + t('something_went_wrong', { + ns: 'common', + }), + }); + + setIsSubmittingRequestForEnvironment(false); + } + } catch (error) { + notifications.error({ + message: t('something_went_wrong', { + ns: 'common', + }), + }); + + setIsSubmittingRequestForEnvironment(false); + } + }; + return ( - <> +
* Select Environment @@ -80,11 +147,47 @@ export default function EnvironmentDetails(): JSX.Element { })}
+
+ + Cannot find what you’re looking for? Request a data source + + +
+ + + + + + +
+
+ {errorDetails && (
{errorDetails}
)} - + ); } diff --git a/frontend/src/periscope.scss b/frontend/src/periscope.scss index d32ac109732d..53c14deb53c5 100644 --- a/frontend/src/periscope.scss +++ b/frontend/src/periscope.scss @@ -30,6 +30,11 @@ background-color: #4566d6; box-shadow: 0 2px 0 rgba(62, 86, 245, 0.09); } + + + &:disabled { + opacity: 0.5; + } } .periscope-tab { diff --git a/frontend/src/types/api/events/types.ts b/frontend/src/types/api/events/types.ts new file mode 100644 index 000000000000..e5b8cd8bd089 --- /dev/null +++ b/frontend/src/types/api/events/types.ts @@ -0,0 +1,9 @@ +export interface EventSuccessPayloadProps { + status: string; + data: string; +} + +export interface EventRequestPayloadProps { + eventName: string; + attributes: Record; +} diff --git a/frontend/src/typings/window.ts b/frontend/src/typings/window.ts index 02197e24446d..3bff939c2dee 100644 --- a/frontend/src/typings/window.ts +++ b/frontend/src/typings/window.ts @@ -6,6 +6,7 @@ declare global { interface Window { store: Store; clarity: ClarityType; + Intercom: any; analytics: Record; __REDUX_DEVTOOLS_EXTENSION_COMPOSE__: typeof compose; } From 3babce3ecf329110e995d4415a9cf2551a0be47f Mon Sep 17 00:00:00 2001 From: Vikrant Gupta Date: Tue, 2 Apr 2024 11:31:42 +0530 Subject: [PATCH 21/68] fix: added dashboard and QB shortcuts to the sidenav (#4791) --- .../constants/shortcuts/DashboardShortcuts.ts | 5 +++-- frontend/src/constants/shortcuts/QBShortcuts.ts | 2 +- frontend/src/pages/Shortcuts/utils.ts | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/frontend/src/constants/shortcuts/DashboardShortcuts.ts b/frontend/src/constants/shortcuts/DashboardShortcuts.ts index ee861708f751..aaa81cb3c16e 100644 --- a/frontend/src/constants/shortcuts/DashboardShortcuts.ts +++ b/frontend/src/constants/shortcuts/DashboardShortcuts.ts @@ -9,9 +9,10 @@ export const DashboardShortcuts = { export const DashboardShortcutsName = { SaveChanges: `${userOS === UserOperatingSystem.MACOS ? 'cmd' : 'ctrl'}+s`, + DiscardChanges: `${userOS === UserOperatingSystem.MACOS ? 'cmd' : 'ctrl'}+d`, }; export const DashboardShortcutsDescription = { - SaveChanges: 'Save Changes', - DiscardChanges: 'Discard Changes', + SaveChanges: 'Save Changes for panel', + DiscardChanges: 'Discard Changes for panel', }; diff --git a/frontend/src/constants/shortcuts/QBShortcuts.ts b/frontend/src/constants/shortcuts/QBShortcuts.ts index 56fea081df6d..d1d841595abf 100644 --- a/frontend/src/constants/shortcuts/QBShortcuts.ts +++ b/frontend/src/constants/shortcuts/QBShortcuts.ts @@ -13,5 +13,5 @@ export const QBShortcutsName = { }; export const QBShortcutsDescription = { - StageAndRunQuery: 'Stage and Run the query', + StageAndRunQuery: 'Stage and Run the current query', }; diff --git a/frontend/src/pages/Shortcuts/utils.ts b/frontend/src/pages/Shortcuts/utils.ts index 21dfa287676f..5f03b0e86aa8 100644 --- a/frontend/src/pages/Shortcuts/utils.ts +++ b/frontend/src/pages/Shortcuts/utils.ts @@ -1,4 +1,9 @@ import { TableProps } from 'antd'; +import { + DashboardShortcuts, + DashboardShortcutsDescription, + DashboardShortcutsName, +} from 'constants/shortcuts/DashboardShortcuts'; import { GlobalShortcuts, GlobalShortcutsDescription, @@ -9,16 +14,25 @@ import { LogsExplorerShortcutsDescription, LogsExplorerShortcutsName, } from 'constants/shortcuts/logsExplorerShortcuts'; +import { + QBShortcuts, + QBShortcutsDescription, + QBShortcutsName, +} from 'constants/shortcuts/QBShortcuts'; // eslint-disable-next-line @typescript-eslint/naming-convention export const ALL_SHORTCUTS: Record> = { 'Global Shortcuts': GlobalShortcuts, 'Logs Explorer Shortcuts': LogsExplorerShortcuts, + 'Query Builder Shortcuts': QBShortcuts, + 'Dashboard Shortcuts': DashboardShortcuts, }; export const ALL_SHORTCUTS_LABEL: Record> = { 'Global Shortcuts': GlobalShortcutsName, 'Logs Explorer Shortcuts': LogsExplorerShortcutsName, + 'Query Builder Shortcuts': QBShortcutsName, + 'Dashboard Shortcuts': DashboardShortcutsName, }; export const ALL_SHORTCUTS_DESCRIPTION: Record< @@ -27,6 +41,8 @@ export const ALL_SHORTCUTS_DESCRIPTION: Record< > = { 'Global Shortcuts': GlobalShortcutsDescription, 'Logs Explorer Shortcuts': LogsExplorerShortcutsDescription, + 'Query Builder Shortcuts': QBShortcutsDescription, + 'Dashboard Shortcuts': DashboardShortcutsDescription, }; export const shortcutColumns = [ From 7a7d814288445d8a577382d575424963aa481161 Mon Sep 17 00:00:00 2001 From: Vikrant Gupta Date: Tue, 2 Apr 2024 12:38:10 +0530 Subject: [PATCH 22/68] fix: sidenav items overlapping in small screens (#4789) --- .../src/container/SideNav/SideNav.styles.scss | 95 +++++++---- frontend/src/container/SideNav/SideNav.tsx | 148 +++++++++--------- 2 files changed, 138 insertions(+), 105 deletions(-) diff --git a/frontend/src/container/SideNav/SideNav.styles.scss b/frontend/src/container/SideNav/SideNav.styles.scss index 2cc32e12f36c..b796c9727c7b 100644 --- a/frontend/src/container/SideNav/SideNav.styles.scss +++ b/frontend/src/container/SideNav/SideNav.styles.scss @@ -78,36 +78,65 @@ box-shadow: none !important; } } + .nav-wrapper { + height: calc(100% - 52px); - .secondary-nav-items { - border-top: 1px solid var(--bg-slate-400); - padding: 8px 0; - max-width: 100%; - position: fixed; - bottom: 0; - left: 0; - width: 240px; + .primary-nav-items { + max-height: 65%; + overflow-y: auto; + overflow-x: hidden; - transition: all 0.3s, background 0s, border 0s; - - // position: relative; - - .collapse-expand-handlers { - position: absolute; - - top: -9px; - right: -9px; - cursor: pointer; - - display: none; - - transition: display 0.3s; - - svg { - fill: var(--bg-vanilla-400); - color: var(--bg-slate-300); + &::-webkit-scrollbar { + width: 0.1rem; } } + .secondary-nav-items { + max-height: 35%; + overflow-y: auto; + overflow-x: hidden; + border-top: 1px solid var(--bg-slate-400); + padding: 8px 0; + max-width: 100%; + position: fixed; + bottom: 0; + left: 0; + width: 240px; + + transition: all 0.3s, background 0s, border 0s; + + &::-webkit-scrollbar { + width: 0.1rem; + } + + .collapse-expand-handlers { + position: absolute; + + top: -9px; + right: -9px; + cursor: pointer; + + display: none; + + transition: display 0.3s; + + svg { + fill: var(--bg-vanilla-400); + color: var(--bg-slate-300); + } + } + } + } + + .nav-wrapper-cloud { + height: calc(100% - 88px); + + .secondary-nav-items { + max-height: 30%; + } + + .primary-nav-items { + max-height: 70%; + } } &.collapsed { @@ -157,13 +186,15 @@ } } - .secondary-nav-items { - border-top: 1px solid var(--bg-vanilla-400); + .nav-wrapper { + .secondary-nav-items { + border-top: 1px solid var(--bg-vanilla-400); - .collapse-expand-handlers { - svg { - color: var(--bg-slate-300); - fill: var(--bg-vanilla-400); + .collapse-expand-handlers { + svg { + color: var(--bg-slate-300); + fill: var(--bg-vanilla-400); + } } } } diff --git a/frontend/src/container/SideNav/SideNav.tsx b/frontend/src/container/SideNav/SideNav.tsx index 6b11ae140c60..8ff08ca85e82 100644 --- a/frontend/src/container/SideNav/SideNav.tsx +++ b/frontend/src/container/SideNav/SideNav.tsx @@ -375,90 +375,92 @@ function SideNav({
)} -
- {menuItems.map((item, index) => ( - { - handleMenuItemClick(event, item); - }} - /> - ))} -
- -
- - - {licenseData && !isLicenseActive && ( - - )} - - {userManagementMenuItems.map( - (item, index): JSX.Element => ( +
+
+ {menuItems.map((item, index) => ( { - handleUserManagentMenuItemClick(item?.key as string, event); + isActive={activeMenuKey === item.key} + onClick={(event): void => { + handleMenuItemClick(event, item); }} /> - ), - )} + ))} +
- {inviteMembers && ( +
{ - if (isCtrlMetaKey(event)) { - openInNewTab(`${inviteMemberMenuItem.key}`); - } else { - history.push(`${inviteMemberMenuItem.key}`); - } - }} + key="keyboardShortcuts" + item={shortcutMenuItem} + isActive={false} + onClick={onClickShortcuts} /> - )} - {user && ( - { - handleUserManagentMenuItemClick( - userSettingsMenuItem?.key as string, - event, - ); - }} - /> - )} - -
- {collapsed ? ( - - ) : ( - + {licenseData && !isLicenseActive && ( + )} + + {userManagementMenuItems.map( + (item, index): JSX.Element => ( + { + handleUserManagentMenuItemClick(item?.key as string, event); + }} + /> + ), + )} + + {inviteMembers && ( + { + if (isCtrlMetaKey(event)) { + openInNewTab(`${inviteMemberMenuItem.key}`); + } else { + history.push(`${inviteMemberMenuItem.key}`); + } + }} + /> + )} + + {user && ( + { + handleUserManagentMenuItemClick( + userSettingsMenuItem?.key as string, + event, + ); + }} + /> + )} + +
+ {collapsed ? ( + + ) : ( + + )} +
From ec9dbb6853324e0109f5dbcfdd963a1c7c2df88c Mon Sep 17 00:00:00 2001 From: Rajat Dabade Date: Tue, 2 Apr 2024 16:40:41 +0530 Subject: [PATCH 23/68] Dashboard Clean up and list view improvement. (#4675) * refactor: initial setup * refactor: created panelWrapper to separate panel data * fix: type error * fix: the dimension issue for graphs * refactor: done with table value uplot panels * refactor: done with logs panel component * refactor: updated props for log panel component * fix: query range duplicate issue for logs * refactor: trace list view done * fix: full view support * refactor: done with edit mode for panels * refactor: type and props * refactor: reduce an extra api call on edit for list view * refactor: done with full graph visibility handler * refactor: removed commented code * refactor: removed commented code * fix: build failure * refactor: updated service layer graphs * refactor: updated top level oparation query key * refactor: added drag select * refactor: done with drag select in chart * refactor: code cleanup * refactor: legend should not need stage and run query --- .../GridCard/FullView/index.tsx | 216 +++++++---------- .../GridCard/FullView/styles.ts | 1 + .../GridCardLayout/GridCard/FullView/types.ts | 2 - .../GridCard/WidgetGraphComponent.tsx | 50 ++-- .../GridCardLayout/GridCard/index.tsx | 159 +++--------- .../GridCardLayout/GridCard/types.ts | 23 +- .../GridCardLayout/GridCardLayout.tsx | 32 ++- .../src/container/GridPanelSwitch/index.tsx | 34 +-- .../src/container/GridPanelSwitch/types.ts | 4 +- .../LogsPanelTable/LogsPanelComponent.tsx | 228 +++++++----------- .../src/container/LogsPanelTable/utils.tsx | 51 ++++ .../MetricsApplication.factory.ts | 2 + .../MetricsApplication/Tabs/DBCall.tsx | 8 +- .../MetricsApplication/Tabs/External.tsx | 21 +- .../MetricsApplication/Tabs/Overview.tsx | 86 +++---- .../Tabs/Overview/ApDex/ApDexMetrics.tsx | 2 - .../Tabs/Overview/ApDex/ApDexTraces.tsx | 1 - .../Tabs/Overview/ServiceOverview.tsx | 65 ++--- .../Tabs/Overview/TopLevelOperations.tsx | 28 ++- .../container/MetricsApplication/styles.ts | 4 +- .../src/container/MetricsApplication/types.ts | 1 + .../LeftContainer/QuerySection/index.tsx | 23 +- .../WidgetGraph/WidgetGraphContainer.tsx | 69 ++---- .../WidgetGraph/WidgetGraphs.tsx | 181 ++++---------- .../LeftContainer/WidgetGraph/index.tsx | 52 +--- .../NewWidget/LeftContainer/index.tsx | 94 ++++++-- frontend/src/container/NewWidget/index.tsx | 99 +++++--- frontend/src/container/NewWidget/types.ts | 25 +- .../PanelWrapper/ListPanelWrapper.tsx | 37 +++ .../container/PanelWrapper/PanelWrapper.tsx | 40 +++ .../PanelWrapper/TablePanelWrapper.tsx | 24 ++ .../PanelWrapper/UplotPanelWrapper.tsx | 141 +++++++++++ .../PanelWrapper/ValuePanelWrapper.tsx | 21 ++ .../src/container/PanelWrapper/constants.ts | 16 ++ .../PanelWrapper/panelWrapper.types.ts | 22 ++ .../TracesTableComponent.tsx | 99 +++----- 36 files changed, 1005 insertions(+), 956 deletions(-) create mode 100644 frontend/src/container/PanelWrapper/ListPanelWrapper.tsx create mode 100644 frontend/src/container/PanelWrapper/PanelWrapper.tsx create mode 100644 frontend/src/container/PanelWrapper/TablePanelWrapper.tsx create mode 100644 frontend/src/container/PanelWrapper/UplotPanelWrapper.tsx create mode 100644 frontend/src/container/PanelWrapper/ValuePanelWrapper.tsx create mode 100644 frontend/src/container/PanelWrapper/constants.ts create mode 100644 frontend/src/container/PanelWrapper/panelWrapper.types.ts diff --git a/frontend/src/container/GridCardLayout/GridCard/FullView/index.tsx b/frontend/src/container/GridCardLayout/GridCard/FullView/index.tsx index c24a731d5ebc..e4f14e8e1901 100644 --- a/frontend/src/container/GridCardLayout/GridCard/FullView/index.tsx +++ b/frontend/src/container/GridCardLayout/GridCard/FullView/index.tsx @@ -1,62 +1,60 @@ import './WidgetFullView.styles.scss'; -import { SyncOutlined } from '@ant-design/icons'; -import { Button } from 'antd'; +import { LoadingOutlined, SyncOutlined } from '@ant-design/icons'; +import { Button, Spin } from 'antd'; import cx from 'classnames'; import { ToggleGraphProps } from 'components/Graph/types'; import Spinner from 'components/Spinner'; import TimePreference from 'components/TimePreferenceDropDown'; import { DEFAULT_ENTITY_VERSION } from 'constants/app'; +import { QueryParams } from 'constants/query'; import { PANEL_TYPES } from 'constants/queryBuilder'; -import GridPanelSwitch from 'container/GridPanelSwitch'; import { timeItems, timePreferance, } from 'container/NewWidget/RightContainer/timeItems'; +import PanelWrapper from 'container/PanelWrapper/PanelWrapper'; import { useGetQueryRange } from 'hooks/queryBuilder/useGetQueryRange'; import { useStepInterval } from 'hooks/queryBuilder/useStepInterval'; import { useChartMutable } from 'hooks/useChartMutable'; -import { useIsDarkMode } from 'hooks/useDarkMode'; +import useUrlQuery from 'hooks/useUrlQuery'; import { getDashboardVariables } from 'lib/dashbaordVariables/getDashboardVariables'; -import { getUPlotChartOptions } from 'lib/uPlotLib/getUplotChartOptions'; -import { getUPlotChartData } from 'lib/uPlotLib/utils/getUplotChartData'; +import { GetQueryResultsProps } from 'lib/dashboard/getQueryResults'; +import GetMinMax from 'lib/getMinMax'; +import history from 'lib/history'; import { useDashboard } from 'providers/Dashboard/Dashboard'; import { useCallback, useEffect, useRef, useState } from 'react'; -import { useSelector } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; +import { useLocation } from 'react-router-dom'; +import { UpdateTimeInterval } from 'store/actions'; import { AppState } from 'store/reducers'; import { GlobalReducer } from 'types/reducer/globalTime'; -import uPlot from 'uplot'; +import { getGraphType } from 'utils/getGraphType'; import { getSortedSeriesData } from 'utils/getSortedSeriesData'; -import { getTimeRange } from 'utils/getTimeRange'; import { getLocalStorageGraphVisibilityState } from '../utils'; import { PANEL_TYPES_VS_FULL_VIEW_TABLE } from './contants'; -import GraphManager from './GraphManager'; import { GraphContainer, TimeContainer } from './styles'; import { FullViewProps } from './types'; function FullView({ widget, fullViewOptions = true, - onClickHandler, - name, version, originalName, - yAxisUnit, - onDragSelect, isDependedDataLoaded = false, onToggleModelHandler, - parentChartRef, }: FullViewProps): JSX.Element { const { selectedTime: globalSelectedTime } = useSelector< AppState, GlobalReducer >((state) => state.globalTime); + const dispatch = useDispatch(); + const urlQuery = useUrlQuery(); + const location = useLocation(); const fullViewRef = useRef(null); - const [chartOptions, setChartOptions] = useState(); - const { selectedDashboard, isDashboardLocked } = useDashboard(); const getSelectedTime = useCallback( @@ -74,24 +72,70 @@ function FullView({ const updatedQuery = useStepInterval(widget?.query); - const response = useGetQueryRange( - { - selectedTime: selectedTime.enum, - graphType: - widget.panelTypes === PANEL_TYPES.BAR - ? PANEL_TYPES.TIME_SERIES - : widget.panelTypes, + const [requestData, setRequestData] = useState(() => { + if (widget.panelTypes !== PANEL_TYPES.LIST) { + return { + selectedTime: selectedTime.enum, + graphType: getGraphType(widget.panelTypes), + query: updatedQuery, + globalSelectedInterval: globalSelectedTime, + variables: getDashboardVariables(selectedDashboard?.data.variables), + }; + } + updatedQuery.builder.queryData[0].pageSize = 10; + return { query: updatedQuery, + graphType: PANEL_TYPES.LIST, + selectedTime: 'GLOBAL_TIME', globalSelectedInterval: globalSelectedTime, - variables: getDashboardVariables(selectedDashboard?.data.variables), - }, + tableParams: { + pagination: { + offset: 0, + limit: updatedQuery.builder.queryData[0].limit || 0, + }, + }, + }; + }); + + useEffect(() => { + setRequestData((prev) => ({ + ...prev, + selectedTime: selectedTime.enum, + })); + }, [selectedTime]); + + const response = useGetQueryRange( + requestData, selectedDashboard?.data?.version || version || DEFAULT_ENTITY_VERSION, { - queryKey: `FullViewGetMetricsQueryRange-${selectedTime.enum}-${globalSelectedTime}-${widget.id}`, - enabled: !isDependedDataLoaded && widget.panelTypes !== PANEL_TYPES.LIST, // Internally both the list view panel has it's own query range api call, so we don't need to call it again + queryKey: [widget?.query, widget?.panelTypes, requestData, version], + enabled: !isDependedDataLoaded, + keepPreviousData: true, }, ); + const onDragSelect = useCallback( + (start: number, end: number): void => { + const startTimestamp = Math.trunc(start); + const endTimestamp = Math.trunc(end); + + if (startTimestamp !== endTimestamp) { + dispatch(UpdateTimeInterval('custom', [startTimestamp, endTimestamp])); + } + + const { maxTime, minTime } = GetMinMax('custom', [ + startTimestamp, + endTimestamp, + ]); + + urlQuery.set(QueryParams.startTime, minTime.toString()); + urlQuery.set(QueryParams.endTime, maxTime.toString()); + const generatedUrl = `${location.pathname}?${urlQuery.toString()}`; + history.push(generatedUrl); + }, + [dispatch, location.pathname, urlQuery], + ); + const [graphsVisibilityStates, setGraphsVisibilityStates] = useState< boolean[] >(Array(response.data?.payload.data.result.length).fill(true)); @@ -118,60 +162,6 @@ function FullView({ response.data.payload.data.result = sortedSeriesData; } - const chartData = getUPlotChartData(response?.data?.payload, widget.fillSpans); - - const isDarkMode = useIsDarkMode(); - - const [minTimeScale, setMinTimeScale] = useState(); - const [maxTimeScale, setMaxTimeScale] = useState(); - - const { minTime, maxTime, selectedTime: globalSelectedInterval } = useSelector< - AppState, - GlobalReducer - >((state) => state.globalTime); - - useEffect((): void => { - const { startTime, endTime } = getTimeRange(response); - - setMinTimeScale(startTime); - setMaxTimeScale(endTime); - }, [maxTime, minTime, globalSelectedInterval, response]); - - useEffect(() => { - if (!response.isFetching && fullViewRef.current) { - const width = fullViewRef.current?.clientWidth - ? fullViewRef.current.clientWidth - 45 - : 700; - - const height = fullViewRef.current?.clientWidth - ? fullViewRef.current.clientHeight - : 300; - - const newChartOptions = getUPlotChartOptions({ - id: originalName, - yAxisUnit: yAxisUnit || '', - apiResponse: response.data?.payload, - dimensions: { - height, - width, - }, - isDarkMode, - onDragSelect, - graphsVisibilityStates, - setGraphsVisibilityStates, - thresholds: widget.thresholds, - minTimeScale, - maxTimeScale, - softMax: widget.softMax === undefined ? null : widget.softMax, - softMin: widget.softMin === undefined ? null : widget.softMin, - panelType: widget.panelTypes, - }); - - setChartOptions(newChartOptions); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [response.isFetching, graphsVisibilityStates, fullViewRef.current]); - useEffect(() => { graphsVisibilityStates?.forEach((e, i) => { fullViewChartRef?.current?.toggleGraph(i, e); @@ -180,7 +170,7 @@ function FullView({ const isListView = widget.panelTypes === PANEL_TYPES.LIST; - if (response.isFetching) { + if (response.isLoading && widget.panelTypes !== PANEL_TYPES.LIST) { return ; } @@ -189,6 +179,9 @@ function FullView({
{fullViewOptions && ( + {response.isFetching && ( + } /> + )} - {chartOptions && ( - - - - )} + + +
- - {canModifyChart && chartOptions && !isDashboardLocked && ( - - )}
); } diff --git a/frontend/src/container/GridCardLayout/GridCard/FullView/styles.ts b/frontend/src/container/GridCardLayout/GridCard/FullView/styles.ts index f963b3137128..0133b1a49bf0 100644 --- a/frontend/src/container/GridCardLayout/GridCard/FullView/styles.ts +++ b/frontend/src/container/GridCardLayout/GridCard/FullView/styles.ts @@ -18,6 +18,7 @@ export const NotFoundContainer = styled.div` export const TimeContainer = styled.div` display: flex; justify-content: flex-end; + align-items: center; ${({ $panelType }): FlattenSimpleInterpolation => $panelType === PANEL_TYPES.TABLE ? css` diff --git a/frontend/src/container/GridCardLayout/GridCard/FullView/types.ts b/frontend/src/container/GridCardLayout/GridCard/FullView/types.ts index 6b2e750ae9b2..7440278fd899 100644 --- a/frontend/src/container/GridCardLayout/GridCard/FullView/types.ts +++ b/frontend/src/container/GridCardLayout/GridCard/FullView/types.ts @@ -53,10 +53,8 @@ export interface FullViewProps { version?: string; originalName: string; yAxisUnit?: string; - onDragSelect: (start: number, end: number) => void; isDependedDataLoaded?: boolean; onToggleModelHandler?: GraphManagerProps['onToggleModelHandler']; - parentChartRef: GraphManagerProps['lineChartRef']; } export interface GraphManagerProps extends UplotProps { diff --git a/frontend/src/container/GridCardLayout/GridCard/WidgetGraphComponent.tsx b/frontend/src/container/GridCardLayout/GridCard/WidgetGraphComponent.tsx index 3dddc4688496..505a1864bca0 100644 --- a/frontend/src/container/GridCardLayout/GridCard/WidgetGraphComponent.tsx +++ b/frontend/src/container/GridCardLayout/GridCard/WidgetGraphComponent.tsx @@ -6,7 +6,7 @@ import { ToggleGraphProps } from 'components/Graph/types'; import { SOMETHING_WENT_WRONG } from 'constants/api'; import { QueryParams } from 'constants/query'; import { PANEL_TYPES } from 'constants/queryBuilder'; -import GridPanelSwitch from 'container/GridPanelSwitch'; +import PanelWrapper from 'container/PanelWrapper/PanelWrapper'; import { useUpdateDashboard } from 'hooks/dashboard/useUpdateDashboard'; import { useNotifications } from 'hooks/useNotifications'; import useUrlQuery from 'hooks/useUrlQuery'; @@ -33,23 +33,20 @@ import FullView from './FullView'; import { Modal } from './styles'; import { WidgetGraphComponentProps } from './types'; import { getLocalStorageGraphVisibilityState } from './utils'; +// import { getLocalStorageGraphVisibilityState } from './utils'; function WidgetGraphComponent({ widget, queryResponse, errorMessage, - name, version, threshold, headerMenuList, isWarning, - data, - options, - graphVisibiltyState, + isFetchingResponse, + setRequestData, onClickHandler, onDragSelect, - setGraphVisibility, - isFetchingResponse, }: WidgetGraphComponentProps): JSX.Element { const [deleteModal, setDeleteModal] = useState(false); const [hovered, setHovered] = useState(false); @@ -61,12 +58,15 @@ function WidgetGraphComponent({ const isFullViewOpen = params.get(QueryParams.expandedWidgetId) === widget.id; const lineChartRef = useRef(); + const [graphVisibility, setGraphVisibility] = useState( + Array(queryResponse.data?.payload?.data.result.length || 0).fill(true), + ); const graphRef = useRef(null); useEffect(() => { if (!lineChartRef.current) return; - graphVisibiltyState.forEach((state, index) => { + graphVisibility.forEach((state, index) => { lineChartRef.current?.toggleGraph(index, state); }); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -210,7 +210,7 @@ function WidgetGraphComponent({ graphVisibilityStates: localStoredVisibilityState, } = getLocalStorageGraphVisibilityState({ apiResponse: queryResponse.data.payload.data.result, - name, + name: widget.id, }); setGraphVisibility(localStoredVisibilityState); } @@ -252,7 +252,7 @@ function WidgetGraphComponent({ onBlur={(): void => { setHovered(false); }} - id={name} + id={widget.id} > @@ -305,26 +303,22 @@ function WidgetGraphComponent({ isFetchingResponse={isFetchingResponse} />
- {queryResponse.isLoading && } + {queryResponse.isLoading && widget.panelTypes !== PANEL_TYPES.LIST && ( + + )} {(queryResponse.isSuccess || widget.panelTypes === PANEL_TYPES.LIST) && (
-
)} diff --git a/frontend/src/container/GridCardLayout/GridCard/index.tsx b/frontend/src/container/GridCardLayout/GridCard/index.tsx index d81e5182220d..363cba7f769a 100644 --- a/frontend/src/container/GridCardLayout/GridCard/index.tsx +++ b/frontend/src/container/GridCardLayout/GridCard/index.tsx @@ -4,80 +4,43 @@ import { PANEL_TYPES } from 'constants/queryBuilder'; import { CustomTimeType } from 'container/TopNav/DateTimeSelectionV2/config'; import { useGetQueryRange } from 'hooks/queryBuilder/useGetQueryRange'; import { useStepInterval } from 'hooks/queryBuilder/useStepInterval'; -import { useIsDarkMode } from 'hooks/useDarkMode'; -import { useResizeObserver } from 'hooks/useDimensions'; import { useIntersectionObserver } from 'hooks/useIntersectionObserver'; -import useUrlQuery from 'hooks/useUrlQuery'; import { getDashboardVariables } from 'lib/dashbaordVariables/getDashboardVariables'; -import GetMinMax from 'lib/getMinMax'; +import { GetQueryResultsProps } from 'lib/dashboard/getQueryResults'; import getTimeString from 'lib/getTimeString'; -import history from 'lib/history'; -import { getUPlotChartOptions } from 'lib/uPlotLib/getUplotChartOptions'; -import { getUPlotChartData } from 'lib/uPlotLib/utils/getUplotChartData'; import isEmpty from 'lodash-es/isEmpty'; -import _noop from 'lodash-es/noop'; import { useDashboard } from 'providers/Dashboard/Dashboard'; -import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { memo, useEffect, useRef, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; -import { useLocation } from 'react-router-dom'; import { UpdateTimeInterval } from 'store/actions'; import { AppState } from 'store/reducers'; import { GlobalReducer } from 'types/reducer/globalTime'; import { getGraphType } from 'utils/getGraphType'; import { getSortedSeriesData } from 'utils/getSortedSeriesData'; -import { getTimeRange } from 'utils/getTimeRange'; import EmptyWidget from '../EmptyWidget'; import { MenuItemKeys } from '../WidgetHeader/contants'; import { GridCardGraphProps } from './types'; -import { getLocalStorageGraphVisibilityState } from './utils'; import WidgetGraphComponent from './WidgetGraphComponent'; function GridCardGraph({ widget, - name, - onClickHandler = _noop, headerMenuList = [MenuItemKeys.View], isQueryEnabled, threshold, variables, - fillSpans = false, version, + onClickHandler, + onDragSelect, }: GridCardGraphProps): JSX.Element { const dispatch = useDispatch(); const [errorMessage, setErrorMessage] = useState(); const { toScrollWidgetId, setToScrollWidgetId } = useDashboard(); - const [minTimeScale, setMinTimeScale] = useState(); - const [maxTimeScale, setMaxTimeScale] = useState(); - const urlQuery = useUrlQuery(); - const location = useLocation(); const { minTime, maxTime, selectedTime: globalSelectedInterval } = useSelector< AppState, GlobalReducer >((state) => state.globalTime); - const onDragSelect = useCallback( - (start: number, end: number): void => { - const startTimestamp = Math.trunc(start); - const endTimestamp = Math.trunc(end); - - if (startTimestamp !== endTimestamp) { - dispatch(UpdateTimeInterval('custom', [startTimestamp, endTimestamp])); - } - - const { maxTime, minTime } = GetMinMax('custom', [ - startTimestamp, - endTimestamp, - ]); - - urlQuery.set(QueryParams.startTime, minTime.toString()); - urlQuery.set(QueryParams.endTime, maxTime.toString()); - const generatedUrl = `${location.pathname}?${urlQuery.toString()}`; - history.push(generatedUrl); - }, - [dispatch, location.pathname, urlQuery], - ); - const handleBackNavigation = (): void => { const searchParams = new URLSearchParams(window.location.search); const startTime = searchParams.get(QueryParams.startTime); @@ -127,19 +90,39 @@ function GridCardGraph({ const isEmptyWidget = widget?.id === PANEL_TYPES.EMPTY_WIDGET || isEmpty(widget); - const queryEnabledCondition = - isVisible && - !isEmptyWidget && - isQueryEnabled && - widget.panelTypes !== PANEL_TYPES.LIST; + const queryEnabledCondition = isVisible && !isEmptyWidget && isQueryEnabled; + + const [requestData, setRequestData] = useState(() => { + if (widget.panelTypes !== PANEL_TYPES.LIST) { + return { + selectedTime: widget?.timePreferance, + graphType: getGraphType(widget.panelTypes), + query: updatedQuery, + globalSelectedInterval, + variables: getDashboardVariables(variables), + }; + } + updatedQuery.builder.queryData[0].pageSize = 10; + return { + query: updatedQuery, + graphType: PANEL_TYPES.LIST, + selectedTime: 'GLOBAL_TIME', + globalSelectedInterval, + tableParams: { + pagination: { + offset: 0, + limit: updatedQuery.builder.queryData[0].limit || 0, + }, + }, + }; + }); const queryResponse = useGetQueryRange( { - selectedTime: widget?.timePreferance, - graphType: getGraphType(widget.panelTypes), - query: updatedQuery, - globalSelectedInterval, + ...requestData, variables: getDashboardVariables(variables), + selectedTime: 'GLOBAL_TIME', + globalSelectedInterval, }, version || DEFAULT_ENTITY_VERSION, { @@ -151,6 +134,7 @@ function GridCardGraph({ widget?.query, widget?.panelTypes, widget.timePreferance, + requestData, ], retry(failureCount, error): boolean { if ( @@ -173,15 +157,6 @@ function GridCardGraph({ const isEmptyLayout = widget?.id === PANEL_TYPES.EMPTY_WIDGET; - const containerDimensions = useResizeObserver(graphRef); - - useEffect((): void => { - const { startTime, endTime } = getTimeRange(queryResponse); - - setMinTimeScale(startTime); - setMaxTimeScale(endTime); - }, [maxTime, minTime, globalSelectedInterval, queryResponse]); - if (queryResponse.data && widget.panelTypes === PANEL_TYPES.BAR) { const sortedSeriesData = getSortedSeriesData( queryResponse.data?.payload.data.result, @@ -189,89 +164,29 @@ function GridCardGraph({ queryResponse.data.payload.data.result = sortedSeriesData; } - const chartData = getUPlotChartData(queryResponse?.data?.payload, fillSpans); - - const isDarkMode = useIsDarkMode(); - const menuList = widget.panelTypes === PANEL_TYPES.TABLE || widget.panelTypes === PANEL_TYPES.LIST ? headerMenuList.filter((menu) => menu !== MenuItemKeys.CreateAlerts) : headerMenuList; - const [graphVisibility, setGraphVisibility] = useState( - Array(queryResponse.data?.payload?.data.result.length || 0).fill(true), - ); - - useEffect(() => { - const { - graphVisibilityStates: localStoredVisibilityState, - } = getLocalStorageGraphVisibilityState({ - apiResponse: queryResponse.data?.payload.data.result || [], - name, - }); - setGraphVisibility(localStoredVisibilityState); - }, [name, queryResponse.data?.payload.data.result]); - - const options = useMemo( - () => - getUPlotChartOptions({ - id: widget?.id, - apiResponse: queryResponse.data?.payload, - dimensions: containerDimensions, - isDarkMode, - onDragSelect, - yAxisUnit: widget?.yAxisUnit, - onClickHandler, - thresholds: widget.thresholds, - minTimeScale, - maxTimeScale, - softMax: widget.softMax === undefined ? null : widget.softMax, - softMin: widget.softMin === undefined ? null : widget.softMin, - graphsVisibilityStates: graphVisibility, - setGraphsVisibilityStates: setGraphVisibility, - panelType: widget.panelTypes, - }), - [ - widget?.id, - widget?.yAxisUnit, - widget.thresholds, - widget.softMax, - widget.softMin, - queryResponse.data?.payload, - containerDimensions, - isDarkMode, - onDragSelect, - onClickHandler, - minTimeScale, - maxTimeScale, - graphVisibility, - setGraphVisibility, - widget.panelTypes, - ], - ); - return (
{isEmptyLayout ? ( ) : ( )}
diff --git a/frontend/src/container/GridCardLayout/GridCard/types.ts b/frontend/src/container/GridCardLayout/GridCard/types.ts index 9e527c143db3..1235a264407d 100644 --- a/frontend/src/container/GridCardLayout/GridCard/types.ts +++ b/frontend/src/container/GridCardLayout/GridCard/types.ts @@ -1,9 +1,9 @@ import { ToggleGraphProps } from 'components/Graph/types'; -import { UplotProps } from 'components/Uplot/Uplot'; +import { GetQueryResultsProps } from 'lib/dashboard/getQueryResults'; import { OnClickPluginOpts } from 'lib/uPlotLib/plugins/onClickPlugin'; import { Dispatch, MutableRefObject, ReactNode, SetStateAction } from 'react'; import { UseQueryResult } from 'react-query'; -import { ErrorResponse, SuccessResponse } from 'types/api'; +import { SuccessResponse } from 'types/api'; import { Dashboard, Widgets } from 'types/api/dashboard/getAll'; import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange'; import uPlot from 'uplot'; @@ -16,35 +16,32 @@ export interface GraphVisibilityLegendEntryProps { legendEntry: LegendEntryProps[]; } -export interface WidgetGraphComponentProps extends UplotProps { +export interface WidgetGraphComponentProps { widget: Widgets; queryResponse: UseQueryResult< - SuccessResponse | ErrorResponse + SuccessResponse, + Error >; errorMessage: string | undefined; - name: string; version?: string; - onDragSelect: (start: number, end: number) => void; - onClickHandler?: OnClickPluginOpts['onClick']; threshold?: ReactNode; headerMenuList: MenuItemKeys[]; isWarning: boolean; - graphVisibiltyState: boolean[]; - setGraphVisibility: Dispatch>; isFetchingResponse: boolean; + setRequestData?: Dispatch>; + onClickHandler?: OnClickPluginOpts['onClick']; + onDragSelect: (start: number, end: number) => void; } export interface GridCardGraphProps { widget: Widgets; - name: string; - onDragSelect?: (start: number, end: number) => void; - onClickHandler?: OnClickPluginOpts['onClick']; threshold?: ReactNode; headerMenuList?: WidgetGraphComponentProps['headerMenuList']; + onClickHandler?: OnClickPluginOpts['onClick']; isQueryEnabled: boolean; variables?: Dashboard['data']['variables']; - fillSpans?: boolean; version?: string; + onDragSelect: (start: number, end: number) => void; } export interface GetGraphVisibilityStateOnLegendClickProps { diff --git a/frontend/src/container/GridCardLayout/GridCardLayout.tsx b/frontend/src/container/GridCardLayout/GridCardLayout.tsx index 16ae0eeaa56f..b84e88b292f1 100644 --- a/frontend/src/container/GridCardLayout/GridCardLayout.tsx +++ b/frontend/src/container/GridCardLayout/GridCardLayout.tsx @@ -3,20 +3,25 @@ import './GridCardLayout.styles.scss'; import { PlusOutlined } from '@ant-design/icons'; import { Tooltip } from 'antd'; import { SOMETHING_WENT_WRONG } from 'constants/api'; +import { QueryParams } from 'constants/query'; import { PANEL_TYPES } from 'constants/queryBuilder'; import { themeColors } from 'constants/theme'; import { useUpdateDashboard } from 'hooks/dashboard/useUpdateDashboard'; import useComponentPermission from 'hooks/useComponentPermission'; import { useIsDarkMode } from 'hooks/useDarkMode'; import { useNotifications } from 'hooks/useNotifications'; +import useUrlQuery from 'hooks/useUrlQuery'; +import history from 'lib/history'; import isEqual from 'lodash-es/isEqual'; import { FullscreenIcon } from 'lucide-react'; import { useDashboard } from 'providers/Dashboard/Dashboard'; -import { useEffect, useState } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import { FullScreen, useFullScreenHandle } from 'react-full-screen'; import { Layout } from 'react-grid-layout'; import { useTranslation } from 'react-i18next'; -import { useSelector } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; +import { useLocation } from 'react-router-dom'; +import { UpdateTimeInterval } from 'store/actions'; import { AppState } from 'store/reducers'; import { Dashboard, Widgets } from 'types/api/dashboard/getAll'; import AppReducer from 'types/reducer/app'; @@ -45,6 +50,8 @@ function GraphLayout({ onAddPanelHandler }: GraphLayoutProps): JSX.Element { } = useDashboard(); const { data } = selectedDashboard || {}; const handle = useFullScreenHandle(); + const { pathname } = useLocation(); + const dispatch = useDispatch(); const { widgets, variables } = data || {}; @@ -61,6 +68,7 @@ function GraphLayout({ onAddPanelHandler }: GraphLayoutProps): JSX.Element { const updateDashboardMutation = useUpdateDashboard(); const { notifications } = useNotifications(); + const urlQuery = useUrlQuery(); let permissions: ComponentTypes[] = ['save_layout', 'add_panel']; @@ -126,6 +134,23 @@ function GraphLayout({ onAddPanelHandler }: GraphLayoutProps): JSX.Element { } }; + const onDragSelect = useCallback( + (start: number, end: number) => { + const startTimestamp = Math.trunc(start); + const endTimestamp = Math.trunc(end); + + urlQuery.set(QueryParams.startTime, startTimestamp.toString()); + urlQuery.set(QueryParams.endTime, endTimestamp.toString()); + const generatedUrl = `${pathname}?${urlQuery.toString()}`; + history.replace(generatedUrl); + + if (startTimestamp !== endTimestamp) { + dispatch(UpdateTimeInterval('custom', [startTimestamp, endTimestamp])); + } + }, + [dispatch, pathname, urlQuery], + ); + useEffect(() => { if ( dashboardLayout && @@ -200,11 +225,10 @@ function GraphLayout({ onAddPanelHandler }: GraphLayoutProps): JSX.Element { > diff --git a/frontend/src/container/GridPanelSwitch/index.tsx b/frontend/src/container/GridPanelSwitch/index.tsx index 18d4e7a63a29..d8e526fecd8a 100644 --- a/frontend/src/container/GridPanelSwitch/index.tsx +++ b/frontend/src/container/GridPanelSwitch/index.tsx @@ -1,10 +1,8 @@ import { ToggleGraphProps } from 'components/Graph/types'; -import { DEFAULT_ENTITY_VERSION } from 'constants/app'; import { getComponentForPanelType } from 'constants/panelTypes'; import { PANEL_TYPES } from 'constants/queryBuilder'; import { GRID_TABLE_CONFIG } from 'container/GridTableComponent/config'; import { FC, forwardRef, memo, useMemo } from 'react'; -import { DataSource } from 'types/common/queryBuilder'; import { GridPanelSwitchProps, PropsTypePropsMap } from './types'; @@ -21,10 +19,7 @@ const GridPanelSwitch = forwardRef< query, options, thresholds, - selectedLogFields, - selectedTracesFields, dataSource, - selectedTime, }, ref, ): JSX.Element | null => { @@ -46,20 +41,7 @@ const GridPanelSwitch = forwardRef< query, thresholds, }, - [PANEL_TYPES.LIST]: - dataSource === DataSource.LOGS - ? { - selectedLogsFields: selectedLogFields || [], - query, - version: DEFAULT_ENTITY_VERSION, // As we don't support for Metrics, defaulting to v3 - selectedTime, - } - : { - selectedTracesFields: selectedTracesFields || [], - query, - version: DEFAULT_ENTITY_VERSION, // As we don't support for Metrics, defaulting to v3 - selectedTime, - }, + [PANEL_TYPES.LIST]: null, [PANEL_TYPES.TRACE]: null, [PANEL_TYPES.BAR]: { data, @@ -70,19 +52,7 @@ const GridPanelSwitch = forwardRef< }; return result; - }, [ - data, - options, - ref, - yAxisUnit, - thresholds, - panelData, - query, - dataSource, - selectedLogFields, - selectedTime, - selectedTracesFields, - ]); + }, [data, options, ref, yAxisUnit, thresholds, panelData, query]); const Component = getComponentForPanelType(panelType, dataSource) as FC< PropsTypePropsMap[typeof panelType] diff --git a/frontend/src/container/GridPanelSwitch/types.ts b/frontend/src/container/GridPanelSwitch/types.ts index ea437bf9ff79..e587d59717cb 100644 --- a/frontend/src/container/GridPanelSwitch/types.ts +++ b/frontend/src/container/GridPanelSwitch/types.ts @@ -2,9 +2,7 @@ import { StaticLineProps, ToggleGraphProps } from 'components/Graph/types'; import { UplotProps } from 'components/Uplot/Uplot'; import { GridTableComponentProps } from 'container/GridTableComponent/types'; import { GridValueComponentProps } from 'container/GridValueComponent/types'; -import { LogsPanelComponentProps } from 'container/LogsPanelTable/LogsPanelComponent'; import { timePreferance } from 'container/NewWidget/RightContainer/timeItems'; -import { TracesTableComponentProps } from 'container/TracesTableComponent/TracesTableComponent'; import { OnClickPluginOpts } from 'lib/uPlotLib/plugins/onClickPlugin'; import { ForwardedRef } from 'react'; import { Widgets } from 'types/api/dashboard/getAll'; @@ -40,7 +38,7 @@ export type PropsTypePropsMap = { [PANEL_TYPES.VALUE]: GridValueComponentProps; [PANEL_TYPES.TABLE]: GridTableComponentProps; [PANEL_TYPES.TRACE]: null; - [PANEL_TYPES.LIST]: LogsPanelComponentProps | TracesTableComponentProps; + [PANEL_TYPES.LIST]: null; [PANEL_TYPES.BAR]: UplotProps & { ref: ForwardedRef; }; diff --git a/frontend/src/container/LogsPanelTable/LogsPanelComponent.tsx b/frontend/src/container/LogsPanelTable/LogsPanelComponent.tsx index 618f7325951b..59f78499b304 100644 --- a/frontend/src/container/LogsPanelTable/LogsPanelComponent.tsx +++ b/frontend/src/container/LogsPanelTable/LogsPanelComponent.tsx @@ -4,82 +4,53 @@ import { Table } from 'antd'; import LogDetail from 'components/LogDetail'; import { VIEW_TYPES } from 'components/LogDetail/constants'; import { SOMETHING_WENT_WRONG } from 'constants/api'; -import { DEFAULT_ENTITY_VERSION } from 'constants/app'; -import { OPERATORS, PANEL_TYPES } from 'constants/queryBuilder'; -import { REACT_QUERY_KEY } from 'constants/reactQueryKeys'; +import { PANEL_TYPES } from 'constants/queryBuilder'; import Controls from 'container/Controls'; -import { timePreferance } from 'container/NewWidget/RightContainer/timeItems'; import { PER_PAGE_OPTIONS } from 'container/TracesExplorer/ListView/configs'; import { tableStyles } from 'container/TracesExplorer/ListView/styles'; import { useActiveLog } from 'hooks/logs/useActiveLog'; -import { useGetQueryRange } from 'hooks/queryBuilder/useGetQueryRange'; import { Pagination } from 'hooks/queryPagination'; import { useLogsData } from 'hooks/useLogsData'; -import { getDashboardVariables } from 'lib/dashbaordVariables/getDashboardVariables'; import { GetQueryResultsProps } from 'lib/dashboard/getQueryResults'; import { FlatLogData } from 'lib/logs/flatLogData'; import { RowData } from 'lib/query/createTableColumnsFromQuery'; -import { useDashboard } from 'providers/Dashboard/Dashboard'; import { + Dispatch, HTMLAttributes, + SetStateAction, useCallback, useEffect, useMemo, useState, } from 'react'; -import { useSelector } from 'react-redux'; -import { AppState } from 'store/reducers'; +import { UseQueryResult } from 'react-query'; +import { SuccessResponse } from 'types/api'; import { Widgets } from 'types/api/dashboard/getAll'; import { ILog } from 'types/api/logs/log'; -import { DataTypes } from 'types/api/queryBuilder/queryAutocompleteResponse'; -import { Query } from 'types/api/queryBuilder/queryBuilderData'; -import { GlobalReducer } from 'types/reducer/globalTime'; -import { v4 as uuid } from 'uuid'; +import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange'; -import { getLogPanelColumnsList } from './utils'; +import { getLogPanelColumnsList, getNextOrPreviousItems } from './utils'; function LogsPanelComponent({ - selectedLogsFields, - query, - selectedTime, + widget, + setRequestData, + queryResponse, }: LogsPanelComponentProps): JSX.Element { - const { selectedTime: globalSelectedTime, maxTime, minTime } = useSelector< - AppState, - GlobalReducer - >((state) => state.globalTime); - const [pagination, setPagination] = useState({ offset: 0, - limit: query.builder.queryData[0].limit || 0, - }); - - const [requestData, setRequestData] = useState(() => { - const updatedQuery = { ...query }; - updatedQuery.builder.queryData[0].pageSize = 10; - return { - query: updatedQuery, - graphType: PANEL_TYPES.LIST, - selectedTime: 'GLOBAL_TIME', - globalSelectedInterval: globalSelectedTime, - tableParams: { - pagination, - }, - }; + limit: widget.query.builder.queryData[0].limit || 0, }); useEffect(() => { - setRequestData({ - ...requestData, - globalSelectedInterval: globalSelectedTime, + setRequestData((prev) => ({ + ...prev, tableParams: { pagination, }, - }); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [pagination]); + })); + }, [pagination, setRequestData]); const [pageSize, setPageSize] = useState(10); - const { selectedDashboard } = useDashboard(); const handleChangePageSize = (value: number): void => { setPagination({ @@ -88,53 +59,35 @@ function LogsPanelComponent({ offset: value, }); setPageSize(value); - const newQueryData = { ...requestData.query }; - newQueryData.builder.queryData[0].pageSize = value; - const newRequestData = { - ...requestData, - query: newQueryData, - tableParams: { - pagination, - }, - }; - setRequestData(newRequestData); + setRequestData((prev) => { + const newQueryData = { ...prev.query }; + newQueryData.builder.queryData[0].pageSize = value; + return { + ...prev, + query: newQueryData, + tableParams: { + pagination: { + limit: 0, + offset: value, + }, + }, + }; + }); }; - const { data, isFetching, isError } = useGetQueryRange( - { - ...requestData, - globalSelectedInterval: globalSelectedTime, - selectedTime: selectedTime?.enum || 'GLOBAL_TIME', - variables: getDashboardVariables(selectedDashboard?.data.variables), - }, - DEFAULT_ENTITY_VERSION, - { - queryKey: [ - REACT_QUERY_KEY.GET_QUERY_RANGE, - globalSelectedTime, - maxTime, - minTime, - requestData, - pagination, - selectedDashboard?.data.variables, - ], - enabled: !!requestData.query && !!selectedLogsFields?.length, - }, - ); - - const columns = getLogPanelColumnsList(selectedLogsFields); + const columns = getLogPanelColumnsList(widget.selectedLogFields); const dataLength = - data?.payload?.data?.newResult?.data?.result[0]?.list?.length; + queryResponse.data?.payload?.data?.newResult?.data?.result[0]?.list?.length; const totalCount = useMemo(() => dataLength || 0, [dataLength]); const [firstLog, setFirstLog] = useState(); const [lastLog, setLastLog] = useState(); const { logs } = useLogsData({ - result: data?.payload.data.newResult.data.result, + result: queryResponse.data?.payload.data.newResult.data.result, panelType: PANEL_TYPES.LIST, - stagedQuery: query, + stagedQuery: widget.query, }); useEffect(() => { @@ -167,92 +120,86 @@ function LogsPanelComponent({ ); const isOrderByTimeStamp = - query.builder.queryData[0].orderBy.length > 0 && - query.builder.queryData[0].orderBy[0].columnName === 'timestamp'; + widget.query.builder.queryData[0].orderBy.length > 0 && + widget.query.builder.queryData[0].orderBy[0].columnName === 'timestamp'; const handlePreviousPagination = (): void => { if (isOrderByTimeStamp) { - setRequestData({ - ...requestData, + setRequestData((prev) => ({ + ...prev, query: { - ...requestData.query, + ...prev.query, builder: { - ...requestData.query.builder, + ...prev.query.builder, queryData: [ { - ...requestData.query.builder.queryData[0], + ...prev.query.builder.queryData[0], filters: { - ...requestData.query.builder.queryData[0].filters, + ...prev.query.builder.queryData[0].filters, items: [ - { - id: uuid(), - key: { - key: 'id', - type: '', - dataType: DataTypes.String, - isColumn: true, - }, - op: OPERATORS['>'], - value: firstLog?.id || '', - }, + ...getNextOrPreviousItems( + prev.query.builder.queryData[0].filters.items, + 'PREV', + firstLog, + ), ], }, + limit: 0, + offset: 0, }, ], }, }, - }); - return; + })); + } + if (!isOrderByTimeStamp) { + setPagination({ + ...pagination, + limit: 0, + offset: pagination.offset - pageSize, + }); } - setPagination({ - ...pagination, - limit: 0, - offset: pagination.offset - pageSize, - }); }; const handleNextPagination = (): void => { if (isOrderByTimeStamp) { - setRequestData({ - ...requestData, + setRequestData((prev) => ({ + ...prev, query: { - ...requestData.query, + ...prev.query, builder: { - ...requestData.query.builder, + ...prev.query.builder, queryData: [ { - ...requestData.query.builder.queryData[0], + ...prev.query.builder.queryData[0], filters: { - ...requestData.query.builder.queryData[0].filters, + ...prev.query.builder.queryData[0].filters, items: [ - { - id: uuid(), - key: { - key: 'id', - type: '', - dataType: DataTypes.String, - isColumn: true, - }, - op: OPERATORS['<'], - value: lastLog?.id || '', - }, + ...getNextOrPreviousItems( + prev.query.builder.queryData[0].filters.items, + 'NEXT', + lastLog, + ), ], }, + limit: 0, + offset: 0, }, ], }, }, - }); - return; + })); + } + if (!isOrderByTimeStamp) { + setPagination({ + ...pagination, + limit: 0, + offset: pagination.offset + pageSize, + }); } - setPagination({ - ...pagination, - limit: 0, - offset: pagination.offset + pageSize, - }); }; - if (isError) { + if (queryResponse.isError) { return
{SOMETHING_WENT_WRONG}
; } @@ -265,19 +212,19 @@ function LogsPanelComponent({ tableLayout="fixed" scroll={{ x: `calc(50vw - 10px)` }} sticky - loading={isFetching} + loading={queryResponse.isFetching} style={tableStyles} dataSource={flattenLogData} columns={columns} onRow={handleRow} /> - {!query.builder.queryData[0].limit && ( + {!widget.query.builder.queryData[0].limit && (
>; + queryResponse: UseQueryResult< + SuccessResponse, + Error + >; + widget: Widgets; }; export default LogsPanelComponent; diff --git a/frontend/src/container/LogsPanelTable/utils.tsx b/frontend/src/container/LogsPanelTable/utils.tsx index 46701e763b64..a95442b7cce5 100644 --- a/frontend/src/container/LogsPanelTable/utils.tsx +++ b/frontend/src/container/LogsPanelTable/utils.tsx @@ -1,10 +1,15 @@ import { ColumnsType } from 'antd/es/table'; import { Typography } from 'antd/lib'; +import { OPERATORS } from 'constants/queryBuilder'; // import Typography from 'antd/es/typography/Typography'; import { RowData } from 'lib/query/createTableColumnsFromQuery'; import { ReactNode } from 'react'; import { Widgets } from 'types/api/dashboard/getAll'; import { IField } from 'types/api/logs/fields'; +import { ILog } from 'types/api/logs/log'; +import { DataTypes } from 'types/api/queryBuilder/queryAutocompleteResponse'; +import { TagFilterItem } from 'types/api/queryBuilder/queryBuilderData'; +import { v4 as uuid } from 'uuid'; export const getLogPanelColumnsList = ( selectedLogFields: Widgets['selectedLogFields'], @@ -36,3 +41,49 @@ export const getLogPanelColumnsList = ( return [...initialColumns, ...columns]; }; + +export const getNextOrPreviousItems = ( + items: TagFilterItem[], + direction: 'NEXT' | 'PREV', + log?: ILog, +): TagFilterItem[] => { + const nextItem = { + id: uuid(), + key: { + key: 'id', + type: '', + dataType: DataTypes.String, + isColumn: true, + }, + op: OPERATORS['<'], + value: log?.id || '', + }; + const prevItem = { + id: uuid(), + key: { + key: 'id', + type: '', + dataType: DataTypes.String, + isColumn: true, + }, + op: OPERATORS['>'], + value: log?.id || '', + }; + let index = items.findIndex((item) => item.op === OPERATORS['<']); + if (index === -1) { + index = items.findIndex((item) => item.op === OPERATORS['>']); + } + if (index === -1) { + if (direction === 'NEXT') { + return [...items, nextItem]; + } + return [...items, prevItem]; + } + const newItems = [...items]; + if (direction === 'NEXT') { + newItems[index] = nextItem; + } else { + newItems[index] = prevItem; + } + return newItems; +}; diff --git a/frontend/src/container/MetricsApplication/MetricsApplication.factory.ts b/frontend/src/container/MetricsApplication/MetricsApplication.factory.ts index b974972d703a..672bc1181246 100644 --- a/frontend/src/container/MetricsApplication/MetricsApplication.factory.ts +++ b/frontend/src/container/MetricsApplication/MetricsApplication.factory.ts @@ -8,6 +8,7 @@ export const getWidgetQueryBuilder = ({ title = '', panelTypes, yAxisUnit = '', + fillSpans = false, id, }: GetWidgetQueryBuilderProps): Widgets => ({ description: '', @@ -24,4 +25,5 @@ export const getWidgetQueryBuilder = ({ softMin: null, selectedLogFields: [], selectedTracesFields: [], + fillSpans, }); diff --git a/frontend/src/container/MetricsApplication/Tabs/DBCall.tsx b/frontend/src/container/MetricsApplication/Tabs/DBCall.tsx index 0d84d4513660..54c211592750 100644 --- a/frontend/src/container/MetricsApplication/Tabs/DBCall.tsx +++ b/frontend/src/container/MetricsApplication/Tabs/DBCall.tsx @@ -70,6 +70,7 @@ function DBCall(): JSX.Element { panelTypes: PANEL_TYPES.TIME_SERIES, yAxisUnit: 'reqps', id: SERVICE_CHART_ID.dbCallsRPS, + fillSpans: false, }), [servicename, tagFilterItems], ); @@ -89,7 +90,8 @@ function DBCall(): JSX.Element { title: GraphTitle.DATABASE_CALLS_AVG_DURATION, panelTypes: PANEL_TYPES.TIME_SERIES, yAxisUnit: 'ms', - id: SERVICE_CHART_ID.dbCallsAvgDuration, + id: GraphTitle.DATABASE_CALLS_AVG_DURATION, + fillSpans: true, }), [servicename, tagFilterItems], ); @@ -112,8 +114,6 @@ function DBCall(): JSX.Element { { onGraphClickHandler(setSelectedTimeStamp)( @@ -147,8 +147,6 @@ function DBCall(): JSX.Element { { diff --git a/frontend/src/container/MetricsApplication/Tabs/External.tsx b/frontend/src/container/MetricsApplication/Tabs/External.tsx index 707675ec1d48..62ce71b6b487 100644 --- a/frontend/src/container/MetricsApplication/Tabs/External.tsx +++ b/frontend/src/container/MetricsApplication/Tabs/External.tsx @@ -18,7 +18,7 @@ import { useParams } from 'react-router-dom'; import { EQueryType } from 'types/common/dashboard'; import { v4 as uuid } from 'uuid'; -import { GraphTitle, legend, MENU_ITEMS, SERVICE_CHART_ID } from '../constant'; +import { GraphTitle, legend, MENU_ITEMS } from '../constant'; import { getWidgetQueryBuilder } from '../MetricsApplication.factory'; import { Card, GraphContainer, Row } from '../styles'; import { Button } from './styles'; @@ -60,7 +60,7 @@ function External(): JSX.Element { title: GraphTitle.EXTERNAL_CALL_ERROR_PERCENTAGE, panelTypes: PANEL_TYPES.TIME_SERIES, yAxisUnit: '%', - id: SERVICE_CHART_ID.externalCallErrorPercentage, + id: GraphTitle.EXTERNAL_CALL_ERROR_PERCENTAGE, }), [servicename, tagFilterItems], ); @@ -86,7 +86,8 @@ function External(): JSX.Element { title: GraphTitle.EXTERNAL_CALL_DURATION, panelTypes: PANEL_TYPES.TIME_SERIES, yAxisUnit: 'ms', - id: SERVICE_CHART_ID.externalCallDuration, + id: GraphTitle.EXTERNAL_CALL_DURATION, + fillSpans: true, }), [servicename, tagFilterItems], ); @@ -108,7 +109,8 @@ function External(): JSX.Element { title: GraphTitle.EXTERNAL_CALL_RPS_BY_ADDRESS, panelTypes: PANEL_TYPES.TIME_SERIES, yAxisUnit: 'reqps', - id: SERVICE_CHART_ID.externalCallRPSByAddress, + id: GraphTitle.EXTERNAL_CALL_RPS_BY_ADDRESS, + fillSpans: true, }), [servicename, tagFilterItems], ); @@ -130,7 +132,8 @@ function External(): JSX.Element { title: GraphTitle.EXTERNAL_CALL_DURATION_BY_ADDRESS, panelTypes: PANEL_TYPES.TIME_SERIES, yAxisUnit: 'ms', - id: SERVICE_CHART_ID.externalCallDurationByAddress, + id: GraphTitle.EXTERNAL_CALL_DURATION_BY_ADDRESS, + fillSpans: true, }), [servicename, tagFilterItems], ); @@ -155,9 +158,7 @@ function External(): JSX.Element { { onGraphClickHandler(setSelectedTimeStamp)( @@ -192,8 +193,6 @@ function External(): JSX.Element { { @@ -230,8 +229,6 @@ function External(): JSX.Element { => @@ -267,10 +264,8 @@ function External(): JSX.Element { { onGraphClickHandler(setSelectedTimeStamp)( xValue, diff --git a/frontend/src/container/MetricsApplication/Tabs/Overview.tsx b/frontend/src/container/MetricsApplication/Tabs/Overview.tsx index 1fde8d09191a..cfaf339d2e6e 100644 --- a/frontend/src/container/MetricsApplication/Tabs/Overview.tsx +++ b/frontend/src/container/MetricsApplication/Tabs/Overview.tsx @@ -19,13 +19,10 @@ import { OnClickPluginOpts } from 'lib/uPlotLib/plugins/onClickPlugin'; import { defaultTo } from 'lodash-es'; import { useCallback, useMemo, useState } from 'react'; import { useQuery } from 'react-query'; -import { useDispatch, useSelector } from 'react-redux'; +import { useDispatch } from 'react-redux'; import { useLocation, useParams } from 'react-router-dom'; import { UpdateTimeInterval } from 'store/actions'; -import { AppState } from 'store/reducers'; import { EQueryType } from 'types/common/dashboard'; -import { GlobalReducer } from 'types/reducer/globalTime'; -import { Tags } from 'types/reducer/trace'; import { v4 as uuid } from 'uuid'; import { GraphTitle, SERVICE_CHART_ID } from '../constant'; @@ -49,9 +46,6 @@ import { } from './util'; function Application(): JSX.Element { - const { maxTime, minTime } = useSelector( - (state) => state.globalTime, - ); const { servicename: encodedServiceName } = useParams(); const servicename = decodeURIComponent(encodedServiceName); const [selectedTimeStamp, setSelectedTimeStamp] = useState(0); @@ -59,10 +53,6 @@ function Application(): JSX.Element { const { queries } = useResourceAttribute(); const urlQuery = useUrlQuery(); - const selectedTags = useMemo( - () => (convertRawQueriesToTraceSelectedTags(queries) as Tags[]) || [], - [queries], - ); const isSpanMetricEnabled = useFeatureFlag(FeatureKeys.USE_SPAN_METRICS) ?.active; @@ -94,7 +84,7 @@ function Application(): JSX.Element { isLoading: topLevelOperationsIsLoading, isError: topLevelOperationsIsError, } = useQuery({ - queryKey: [servicename, minTime, maxTime, selectedTags], + queryKey: [servicename], queryFn: getTopLevelOperations, }); @@ -116,49 +106,41 @@ function Application(): JSX.Element { [servicename, topLevelOperations], ); - const operationPerSecWidget = useMemo( - () => - getWidgetQueryBuilder({ - query: { - queryType: EQueryType.QUERY_BUILDER, - promql: [], - builder: operationPerSec({ - servicename, - tagFilterItems, - topLevelOperations: topLevelOperationsRoute, - }), - clickhouse_sql: [], - id: uuid(), - }, - title: GraphTitle.RATE_PER_OPS, - panelTypes: PANEL_TYPES.TIME_SERIES, - yAxisUnit: 'ops', - id: SERVICE_CHART_ID.rps, + const operationPerSecWidget = getWidgetQueryBuilder({ + query: { + queryType: EQueryType.QUERY_BUILDER, + promql: [], + builder: operationPerSec({ + servicename, + tagFilterItems, + topLevelOperations: topLevelOperationsRoute, }), - [servicename, tagFilterItems, topLevelOperationsRoute], - ); + clickhouse_sql: [], + id: uuid(), + }, + title: GraphTitle.RATE_PER_OPS, + panelTypes: PANEL_TYPES.TIME_SERIES, + yAxisUnit: 'ops', + id: SERVICE_CHART_ID.rps, + }); - const errorPercentageWidget = useMemo( - () => - getWidgetQueryBuilder({ - query: { - queryType: EQueryType.QUERY_BUILDER, - promql: [], - builder: errorPercentage({ - servicename, - tagFilterItems, - topLevelOperations: topLevelOperationsRoute, - }), - clickhouse_sql: [], - id: uuid(), - }, - title: GraphTitle.ERROR_PERCENTAGE, - panelTypes: PANEL_TYPES.TIME_SERIES, - yAxisUnit: '%', - id: SERVICE_CHART_ID.errorPercentage, + const errorPercentageWidget = getWidgetQueryBuilder({ + query: { + queryType: EQueryType.QUERY_BUILDER, + promql: [], + builder: errorPercentage({ + servicename, + tagFilterItems, + topLevelOperations: topLevelOperationsRoute, }), - [servicename, tagFilterItems, topLevelOperationsRoute], - ); + clickhouse_sql: [], + id: uuid(), + }, + title: GraphTitle.ERROR_PERCENTAGE, + panelTypes: PANEL_TYPES.TIME_SERIES, + yAxisUnit: '%', + id: SERVICE_CHART_ID.errorPercentage, + }); const onDragSelect = useCallback( (start: number, end: number) => { diff --git a/frontend/src/container/MetricsApplication/Tabs/Overview/ApDex/ApDexMetrics.tsx b/frontend/src/container/MetricsApplication/Tabs/Overview/ApDex/ApDexMetrics.tsx index abfaf52d584a..dcd01270eeb3 100644 --- a/frontend/src/container/MetricsApplication/Tabs/Overview/ApDex/ApDexMetrics.tsx +++ b/frontend/src/container/MetricsApplication/Tabs/Overview/ApDex/ApDexMetrics.tsx @@ -89,8 +89,6 @@ function ApDexMetrics({ return ( - getWidgetQueryBuilder({ - query: { - queryType: EQueryType.QUERY_BUILDER, - promql: [], - builder: latency({ - servicename, - tagFilterItems, - isSpanMetricEnable, - topLevelOperationsRoute, - }), - clickhouse_sql: [], - id: uuid(), - }, - title: GraphTitle.LATENCY, - panelTypes: PANEL_TYPES.TIME_SERIES, - yAxisUnit: 'ns', - id: SERVICE_CHART_ID.latency, + const latencyWidget = getWidgetQueryBuilder({ + query: { + queryType: EQueryType.QUERY_BUILDER, + promql: [], + builder: latency({ + servicename, + tagFilterItems, + isSpanMetricEnable, + topLevelOperationsRoute, }), - [servicename, isSpanMetricEnable, topLevelOperationsRoute, tagFilterItems], - ); + clickhouse_sql: [], + id: uuid(), + }, + title: GraphTitle.LATENCY, + panelTypes: PANEL_TYPES.TIME_SERIES, + yAxisUnit: 'ns', + id: SERVICE_CHART_ID.latency, + }); const isQueryEnabled = !topLevelOperationsIsLoading && topLevelOperationsRoute.length > 0; @@ -88,15 +85,23 @@ function ServiceOverview({ - + {topLevelOperationsIsLoading && ( + + )} + {!topLevelOperationsIsLoading && ( + + )} diff --git a/frontend/src/container/MetricsApplication/Tabs/Overview/TopLevelOperations.tsx b/frontend/src/container/MetricsApplication/Tabs/Overview/TopLevelOperations.tsx index 1b0903f4fad7..9238e8223166 100644 --- a/frontend/src/container/MetricsApplication/Tabs/Overview/TopLevelOperations.tsx +++ b/frontend/src/container/MetricsApplication/Tabs/Overview/TopLevelOperations.tsx @@ -1,4 +1,4 @@ -import { Typography } from 'antd'; +import { Skeleton, Typography } from 'antd'; import axios from 'axios'; import { SOMETHING_WENT_WRONG } from 'constants/api'; import { ENTITY_VERSION_V4 } from 'constants/app'; @@ -27,15 +27,23 @@ function TopLevelOperation({ ) : ( - + {topLevelOperationsIsLoading && ( + + )} + {!topLevelOperationsIsLoading && ( + + )} )} diff --git a/frontend/src/container/MetricsApplication/styles.ts b/frontend/src/container/MetricsApplication/styles.ts index 2e1ab9c8bfdc..8e396891e766 100644 --- a/frontend/src/container/MetricsApplication/styles.ts +++ b/frontend/src/container/MetricsApplication/styles.ts @@ -13,7 +13,7 @@ export const Card = styled(CardComponent)` } .ant-card-body { - height: calc(100% - 40px); + height: 100%; padding: 0; } `; @@ -40,7 +40,7 @@ export const ColErrorContainer = styled(ColComponent)` export const GraphContainer = styled.div` min-height: calc(40vh - 40px); - height: calc(100% - 40px); + height: 100%; `; export const GraphTitle = styled(Typography)` diff --git a/frontend/src/container/MetricsApplication/types.ts b/frontend/src/container/MetricsApplication/types.ts index 642bf0b05755..d8464d124878 100644 --- a/frontend/src/container/MetricsApplication/types.ts +++ b/frontend/src/container/MetricsApplication/types.ts @@ -10,6 +10,7 @@ export interface GetWidgetQueryBuilderProps { panelTypes: Widgets['panelTypes']; yAxisUnit?: Widgets['yAxisUnit']; id?: Widgets['id']; + fillSpans?: Widgets['fillSpans']; } export interface NavigateToTraceProps { diff --git a/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx b/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx index 9dfd8d0debfd..7c9fca416e39 100644 --- a/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx +++ b/frontend/src/container/NewWidget/LeftContainer/QuerySection/index.tsx @@ -2,14 +2,11 @@ import './QuerySection.styles.scss'; import { Button, Tabs, Tooltip, Typography } from 'antd'; import TextToolTip from 'components/TextToolTip'; -import { DEFAULT_ENTITY_VERSION } from 'constants/app'; import { PANEL_TYPES } from 'constants/queryBuilder'; import { QBShortcuts } from 'constants/shortcuts/QBShortcuts'; -import { WidgetGraphProps } from 'container/NewWidget/types'; import { QueryBuilder } from 'container/QueryBuilder'; import { QueryBuilderProps } from 'container/QueryBuilder/QueryBuilder.interfaces'; import { useKeyboardHotkeys } from 'hooks/hotkeys/useKeyboardHotkeys'; -import { useGetWidgetQueryRange } from 'hooks/queryBuilder/useGetWidgetQueryRange'; import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; import { useShareBuilderUrl } from 'hooks/queryBuilder/useShareBuilderUrl'; import { updateStepInterval } from 'hooks/queryBuilder/useStepInterval'; @@ -22,9 +19,12 @@ import { getSelectedWidgetIndex, } from 'providers/Dashboard/util'; import { useCallback, useEffect, useMemo } from 'react'; +import { UseQueryResult } from 'react-query'; import { useSelector } from 'react-redux'; import { AppState } from 'store/reducers'; +import { SuccessResponse } from 'types/api'; import { Widgets } from 'types/api/dashboard/getAll'; +import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange'; import { Query } from 'types/api/queryBuilder/queryBuilderData'; import { EQueryType } from 'types/common/dashboard'; import AppReducer from 'types/reducer/app'; @@ -35,7 +35,7 @@ import PromQLQueryContainer from './QueryBuilder/promQL'; function QuerySection({ selectedGraph, - selectedTime, + queryResponse, }: QueryProps): JSX.Element { const { currentQuery, redirectWithQueryBuilderData } = useQueryBuilder(); const urlQuery = useUrlQuery(); @@ -51,14 +51,6 @@ function QuerySection({ const { selectedDashboard, setSelectedDashboard } = useDashboard(); - const getWidgetQueryRange = useGetWidgetQueryRange( - { - graphType: selectedGraph, - selectedTime: selectedTime.enum, - }, - selectedDashboard?.data?.version || DEFAULT_ENTITY_VERSION, - ); - const { widgets } = selectedDashboard?.data || {}; const getWidget = useCallback(() => { @@ -233,7 +225,7 @@ function QuerySection({
)} - + {isToDisplayLayout && !renderFullScreen && ( ) => void; @@ -21,18 +18,16 @@ export default function NavItem({ const { label, icon } = item; return ( - -
onClick(event)} - > -
-
-
{icon}
+
onClick(event)} + > +
+
+
{icon}
- {!isCollapsed &&
{label}
} -
+
{label}
- +
); } diff --git a/frontend/src/container/SideNav/SideNav.styles.scss b/frontend/src/container/SideNav/SideNav.styles.scss index b796c9727c7b..ebbde51565fa 100644 --- a/frontend/src/container/SideNav/SideNav.styles.scss +++ b/frontend/src/container/SideNav/SideNav.styles.scss @@ -1,23 +1,41 @@ +.sidenav-container { + width: 64px; + height: 100%; + + &.docked { + width: 240px; + } +} + .sideNav { - flex: 0 0 240px; - max-width: 240px; - min-width: 240px; - width: 240px; + flex: 0 0 64px; + height: 100%; + max-width: 64px; + min-width: 64px; + width: 64px; border-right: 1px solid var(--bg-slate-400); padding-bottom: 48px; - transition: all 0.3s, background 0s, border 0s; + transition: all 0.2s, background 0s, border 0s; position: relative; z-index: 1; + .brand-company-meta { + display: flex; + gap: 8px; + } + .brand { display: flex; align-items: center; + justify-content: center; gap: 12px; padding: var(--padding-4); + height: 64px; .brand-logo { display: flex; align-items: center; + justify-content: space-between; gap: 8px; cursor: pointer; @@ -56,6 +74,15 @@ transition: all 0.2s; } } + + .dockBtn { + cursor: pointer; + background: none; + border: none; + padding: 0; + height: 16px; + width: 16px; + } } .get-started-nav-items { @@ -65,6 +92,7 @@ .get-started-btn { display: flex; align-items: center; + justify-content: center; padding: 8px; margin-left: 2px; gap: 8px; @@ -100,7 +128,7 @@ position: fixed; bottom: 0; left: 0; - width: 240px; + width: 64px; transition: all 0.3s, background 0s, border 0s; @@ -149,10 +177,6 @@ width: 64px; } - .brand { - justify-content: center; - } - .get-started-nav-items { .get-started-btn { justify-content: center; @@ -160,21 +184,82 @@ } } + .nav-item-label { + display: none; + } + &:hover { + flex: 0 0 240px; + max-width: 240px; + min-width: 240px; + width: 240px; + + position: absolute; + height: 100%; + z-index: 10; + background: #0b0c0e; + + .secondary-nav-items { + width: 240px; + } + + .brand { + justify-content: space-between; + } + + .get-started-nav-items { + .get-started-btn { + justify-content: flex-start; + } + } + .collapse-expand-handlers { display: block; } + + .nav-item-label { + display: block; + } + } + + &.docked { + flex: 0 0 240px; + max-width: 240px; + min-width: 240px; + width: 240px; + + .secondary-nav-items { + width: 240px; + } + + .brand { + justify-content: space-between; + } + + .get-started-nav-items { + .get-started-btn { + justify-content: flex-start; + } + } + + .collapse-expand-handlers { + display: block; + } + + .nav-item-label { + display: block; + } } } .lightMode { .sideNav { - background: var(--bg-vanilla-300); - border-right: 1px solid var(--bg-vanilla-400); + background: var(--bg-vanilla-100); + border-right: 1px solid var(--bg-vanilla-300); .get-started-nav-items { .get-started-btn { - border: 1px solid var(--bg-vanilla-400); + border: 1px solid var(--bg-vanilla-300); } } @@ -188,15 +273,19 @@ .nav-wrapper { .secondary-nav-items { - border-top: 1px solid var(--bg-vanilla-400); + border-top: 1px solid var(--bg-vanilla-300); .collapse-expand-handlers { svg { color: var(--bg-slate-300); - fill: var(--bg-vanilla-400); + fill: var(--bg-vanilla-300); } } } } + + &:hover { + background: var(--bg-vanilla-100); + } } } diff --git a/frontend/src/container/SideNav/SideNav.tsx b/frontend/src/container/SideNav/SideNav.tsx index 8ff08ca85e82..ac0028b89e40 100644 --- a/frontend/src/container/SideNav/SideNav.tsx +++ b/frontend/src/container/SideNav/SideNav.tsx @@ -2,7 +2,8 @@ /* eslint-disable jsx-a11y/click-events-have-key-events */ import './SideNav.styles.scss'; -import { Button } from 'antd'; +import { Color } from '@signozhq/design-tokens'; +import { Button, Tooltip } from 'antd'; import cx from 'classnames'; import { FeatureKeys } from 'constants/features'; import ROUTES from 'constants/routes'; @@ -16,6 +17,7 @@ import { CheckSquare, ChevronLeftCircle, ChevronRightCircle, + PanelRight, RocketIcon, UserCircle, } from 'lucide-react'; @@ -224,9 +226,9 @@ function SideNav({ key: SecondaryMenuItemKey.Version, label: !isCurrentVersionError ? currentVersion : t('n_a'), icon: !isLatestVersion ? ( - + ) : ( - + ), onClick: onClickVersionHandler, }; @@ -340,126 +342,135 @@ function SideNav({ }, [deregisterShortcut, onClickHandler, onCollapse, registerShortcut]); return ( -
-
-
{ - // Current home page - onClickHandler(ROUTES.APPLICATION, event); - }} - > - SigNoz - - {!collapsed && SigNoz } -
- - {!collapsed && licenseTag && ( -
{licenseTag}
- )} -
- - {isCloudUserVal && ( -
- -
- )} - -
-
- {menuItems.map((item, index) => ( - { - handleMenuItemClick(event, item); +
+
+
+
+
{ + // Current home page + onClickHandler(ROUTES.APPLICATION, event); }} + > + SigNoz + + SigNoz +
+ + {licenseTag && ( +
{licenseTag}
+ )} +
+ + +
-
- + {isCloudUserVal && ( +
+ +
+ )} - {userManagementMenuItems.map( - (item, index): JSX.Element => ( +
+
+ {menuItems.map((item, index) => ( { - handleUserManagentMenuItemClick(item?.key as string, event); + isActive={activeMenuKey === item.key} + onClick={(event): void => { + handleMenuItemClick(event, item); }} /> - ), - )} + ))} +
- {inviteMembers && ( +
{ - if (isCtrlMetaKey(event)) { - openInNewTab(`${inviteMemberMenuItem.key}`); - } else { - history.push(`${inviteMemberMenuItem.key}`); - } - }} + key="keyboardShortcuts" + item={shortcutMenuItem} + isActive={false} + onClick={onClickShortcuts} /> - )} - {user && ( - { - handleUserManagentMenuItemClick( - userSettingsMenuItem?.key as string, - event, - ); - }} - /> - )} - -
- {collapsed ? ( - - ) : ( - + {licenseData && !isLicenseActive && ( + )} + + {userManagementMenuItems.map( + (item, index): JSX.Element => ( + { + handleUserManagentMenuItemClick(item?.key as string, event); + }} + /> + ), + )} + + {inviteMembers && ( + { + if (isCtrlMetaKey(event)) { + openInNewTab(`${inviteMemberMenuItem.key}`); + } else { + history.push(`${inviteMemberMenuItem.key}`); + } + }} + /> + )} + + {user && ( + { + handleUserManagentMenuItemClick( + userSettingsMenuItem?.key as string, + event, + ); + }} + /> + )} + +
+ {collapsed ? ( + + ) : ( + + )} +
From a47d3289d037b5edf8b987ac6006e19e2acf55cc Mon Sep 17 00:00:00 2001 From: hulk Date: Tue, 2 Apr 2024 23:09:05 +0800 Subject: [PATCH 27/68] fix: typo in the log message (#4769) --- pkg/query-service/agentConf/manager.go | 2 +- pkg/query-service/agentConf/version.go | 2 +- pkg/query-service/main.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/query-service/agentConf/manager.go b/pkg/query-service/agentConf/manager.go index c9a7335e0b9d..18ad142cab8d 100644 --- a/pkg/query-service/agentConf/manager.go +++ b/pkg/query-service/agentConf/manager.go @@ -203,7 +203,7 @@ func StartNewVersion( ) (*ConfigVersion, *model.ApiError) { // create a new version - cfg := NewConfigversion(eleType) + cfg := NewConfigVersion(eleType) // insert new config and elements into database err := m.insertConfig(ctx, userId, cfg, elementIds) diff --git a/pkg/query-service/agentConf/version.go b/pkg/query-service/agentConf/version.go index d2bc4547b30c..73befce78155 100644 --- a/pkg/query-service/agentConf/version.go +++ b/pkg/query-service/agentConf/version.go @@ -45,7 +45,7 @@ type ConfigVersion struct { CreatedAt time.Time `json:"createdAt" db:"created_at"` } -func NewConfigversion(typeDef ElementTypeDef) *ConfigVersion { +func NewConfigVersion(typeDef ElementTypeDef) *ConfigVersion { return &ConfigVersion{ ID: uuid.NewString(), ElementType: typeDef, diff --git a/pkg/query-service/main.go b/pkg/query-service/main.go index ec68c61939d0..b6f5e0281db4 100644 --- a/pkg/query-service/main.go +++ b/pkg/query-service/main.go @@ -87,7 +87,7 @@ func main() { if len(auth.JwtSecret) == 0 { zap.L().Warn("No JWT secret key is specified.") } else { - zap.L().Info("No JWT secret key set successfully.") + zap.L().Info("JWT secret key set successfully.") } server, err := app.NewServer(serverOptions) From eb74cb4c5eaaa8c929782631ae8631dfaf6d17aa Mon Sep 17 00:00:00 2001 From: CheetoDa Date: Wed, 3 Apr 2024 04:03:00 +0530 Subject: [PATCH 28/68] feat: docker completed --- ...dotnet-docker-quickStart-runApplication.md | 2 +- ...otnet-docker-recommended-runApplication.md | 2 +- ...docker-quickStart-instrumentApplication.md | 67 ++++ ...elixir-docker-quickStart-runApplication.md | 25 ++ ...docker-recommended-installOtelCollector.md | 12 + ...ocker-recommended-instrumentApplication.md | 61 ++++ ...lixir-docker-recommended-runApplication.md | 25 ++ ...golang-docker-quickStart-runApplication.md | 2 +- ...olang-docker-recommended-runApplication.md | 2 +- ...docker-quickStart-instrumentApplication.md | 25 ++ .../jboss-docker-quickStart-runApplication.md | 25 ++ ...docker-recommended-installOtelCollector.md | 12 + ...ocker-recommended-instrumentApplication.md | 24 ++ ...jboss-docker-recommended-runApplication.md | 25 ++ ...docker-quickStart-instrumentApplication.md | 27 ++ ...others-docker-quickStart-runApplication.md | 27 ++ ...docker-recommended-installOtelCollector.md | 12 + ...ocker-recommended-instrumentApplication.md | 22 ++ ...thers-docker-recommended-runApplication.md | 26 ++ ...docker-quickStart-instrumentApplication.md | 27 ++ ...ngBoot-docker-quickStart-runApplication.md | 28 ++ ...docker-recommended-installOtelCollector.md | 12 + ...ocker-recommended-instrumentApplication.md | 22 ++ ...gBoot-docker-recommended-runApplication.md | 26 ++ ...docker-quickStart-instrumentApplication.md | 33 ++ ...tomcat-docker-quickStart-runApplication.md | 26 ++ ...docker-recommended-installOtelCollector.md | 96 ++++++ ...ocker-recommended-instrumentApplication.md | 30 ++ ...omcat-docker-recommended-runApplication.md | 26 ++ ...xpress-docker-quickStart-runApplication.md | 2 +- ...press-docker-recommended-runApplication.md | 2 +- ...nestjs-docker-quickStart-runApplication.md | 2 +- ...estjs-docker-recommended-runApplication.md | 2 +- ...nodejs-docker-quickStart-runApplication.md | 2 +- ...odejs-docker-recommended-runApplication.md | 2 +- ...others-docker-quickStart-runApplication.md | 2 +- ...thers-docker-recommended-runApplication.md | 2 +- ...eactjs-docker-quickStart-runApplication.md | 2 +- ...actjs-docker-recommended-runApplication.md | 2 +- ...docker-quickStart-instrumentApplication.md | 79 +++++ .../php-docker-quickStart-runApplication.md | 21 ++ ...docker-recommended-installOtelCollector.md | 96 ++++++ ...ocker-recommended-instrumentApplication.md | 82 +++++ .../php-docker-recommended-runApplication.md | 21 ++ ...django-docker-quickStart-runApplication.md | 2 +- ...jango-docker-recommended-runApplication.md | 2 +- ...falcon-docker-quickStart-runApplication.md | 2 +- ...alcon-docker-recommended-runApplication.md | 2 +- ...astapi-docker-quickStart-runApplication.md | 2 +- ...stapi-docker-recommended-runApplication.md | 2 +- .../flask-docker-quickStart-runApplication.md | 2 +- ...flask-docker-recommended-runApplication.md | 2 +- ...others-docker-quickStart-runApplication.md | 2 +- ...thers-docker-recommended-runApplication.md | 2 +- ...docker-quickStart-instrumentApplication.md | 54 ++++ .../ror-docker-quickStart-runApplication.md | 21 ++ ...docker-recommended-installOtelCollector.md | 12 + ...ocker-recommended-instrumentApplication.md | 57 ++++ .../ror-docker-recommended-runApplication.md | 21 ++ ...docker-quickStart-instrumentApplication.md | 146 +++++++++ .../rust-docker-quickStart-runApplication.md | 21 ++ ...docker-recommended-installOtelCollector.md | 12 + ...ocker-recommended-instrumentApplication.md | 112 +++++++ .../rust-docker-recommended-runApplication.md | 21 ++ ...docker-quickStart-instrumentApplication.md | 71 +++++ .../swift-docker-quickStart-runApplication.md | 21 ++ ...docker-recommended-installOtelCollector.md | 12 + ...ocker-recommended-instrumentApplication.md | 76 +++++ ...swift-docker-recommended-runApplication.md | 21 ++ .../constants/apmDocFilePaths.ts | 298 ++++++++++++++++++ 70 files changed, 2040 insertions(+), 24 deletions(-) create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/QuickStart/elixir-docker-quickStart-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/QuickStart/elixir-docker-quickStart-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/QuickStart/jboss-docker-quickStart-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/QuickStart/jboss-docker-quickStart-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/QuickStart/others-docker-quickStart-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/QuickStart/springBoot-docker-quickStart-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/QuickStart/springBoot-docker-quickStart-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/QuickStart/tomcat-docker-quickStart-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/QuickStart/tomcat-docker-quickStart-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/QuickStart/php-docker-quickStart-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/QuickStart/php-docker-quickStart-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/QuickStart/ror-docker-quickStart-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/QuickStart/ror-docker-quickStart-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/QuickStart/rust-docker-quickStart-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/QuickStart/rust-docker-quickStart-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/QuickStart/swift-docker-quickStart-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/QuickStart/swift-docker-quickStart-runApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-installOtelCollector.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-instrumentApplication.md create mode 100644 frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-runApplication.md diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Docker/QuickStart/dotnet-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Docker/QuickStart/dotnet-docker-quickStart-runApplication.md index 38e5776db750..ab7a5dbaf889 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Docker/QuickStart/dotnet-docker-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Docker/QuickStart/dotnet-docker-quickStart-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Docker/Recommended/dotnet-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Docker/Recommended/dotnet-docker-recommended-runApplication.md index 38e5776db750..ab7a5dbaf889 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Docker/Recommended/dotnet-docker-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Docker/Recommended/dotnet-docker-recommended-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/QuickStart/elixir-docker-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/QuickStart/elixir-docker-quickStart-instrumentApplication.md new file mode 100644 index 000000000000..ffaa4b39387e --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/QuickStart/elixir-docker-quickStart-instrumentApplication.md @@ -0,0 +1,67 @@ +  + +Follow the steps below to instrument your Elixir (Phoenix + Ecto) Application + +### Step 1: Add dependencies +Install dependencies related to OpenTelemetry by adding them to `mix.exs` file + +```bash + {:opentelemetry_exporter, "~> 1.6"}, + {:opentelemetry_api, "~> 1.2"}, + {:opentelemetry, "~> 1.3"}, + {:opentelemetry_semantic_conventions, "~> 0.2"}, + {:opentelemetry_cowboy, "~> 0.2.1"}, + {:opentelemetry_phoenix, "~> 1.1"}, + {:opentelemetry_ecto, "~> 1.1"} +``` +  + +In your application start, usually the `application.ex` file, setup the telemetry handlers + +```bash + :opentelemetry_cowboy.setup() + OpentelemetryPhoenix.setup(adapter: :cowboy2) + OpentelemetryEcto.setup([:{{MYAPP}}, :repo]) +``` +  + +As an example, this is how you can setup the handlers in your application.ex file for an application called demo : + +```bash +# application.ex +@impl true +def start(_type, _args) do + :opentelemetry_cowboy.setup() + OpentelemetryPhoenix.setup(adapter: :cowboy2) + OpentelemetryEcto.setup([:demo, :repo]) + +end +``` + +  + +### Step 2: Configure Application +You need to configure your application to send telemetry data by adding the following config to your `runtime.exs` file: + +```bash +config :opentelemetry, :resource, service: %{name: "{{MYAPP}}"} + +config :opentelemetry, :processors, + otel_batch_processor: %{ + exporter: { + :opentelemetry_exporter, + %{ + endpoints: ["https://ingest.{{REGION}}.signoz.cloud:443"], + headers: [ + {"signoz-access-token", {{SIGNOZ_ACCESS_TOKEN}} } + ] + } + } + } +``` + +  + +### Step 3: Dockerize your application + +Since the environment variables like SIGNOZ_INGESTION_KEY, Ingestion Endpoint and Service name are set in the above steps, you don't need to add any additional steps in your Dockerfile. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/QuickStart/elixir-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/QuickStart/elixir-docker-quickStart-runApplication.md new file mode 100644 index 000000000000..7b902502a6ed --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/QuickStart/elixir-docker-quickStart-runApplication.md @@ -0,0 +1,25 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` + +  + +To see some examples for instrumented applications, you can checkout [this link](https://signoz.io/docs/instrumentation/elixir/#sample-examples) \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-installOtelCollector.md new file mode 100644 index 000000000000..fbeda9c337a1 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-installOtelCollector.md @@ -0,0 +1,12 @@ +## Setup OpenTelemetry Binary as an agent + +  + +As a first step, you should install the OTel collector Binary according to the instructions provided on [this link](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/). + +  + +Once you are done setting up the OTel collector binary, you can follow the next steps. + +  + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-instrumentApplication.md new file mode 100644 index 000000000000..306f5cb12163 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-instrumentApplication.md @@ -0,0 +1,61 @@ +  + +After setting up the Otel collector agent, follow the steps below to instrument your Elixir (Phoenix + Ecto) Application + +### Step 1: Add dependencies +Install dependencies related to OpenTelemetry by adding them to `mix.exs` file + +```bash + {:opentelemetry_exporter, "~> 1.6"}, + {:opentelemetry_api, "~> 1.2"}, + {:opentelemetry, "~> 1.3"}, + {:opentelemetry_semantic_conventions, "~> 0.2"}, + {:opentelemetry_cowboy, "~> 0.2.1"}, + {:opentelemetry_phoenix, "~> 1.1"}, + {:opentelemetry_ecto, "~> 1.1"} +``` +  + +In your application start, usually the `application.ex` file, setup the telemetry handlers + +```bash + :opentelemetry_cowboy.setup() + OpentelemetryPhoenix.setup(adapter: :cowboy2) + OpentelemetryEcto.setup([:{{MYAPP}}, :repo]) +``` +  + +As an example, this is how you can setup the handlers in your application.ex file for an application called demo : + +```bash +# application.ex +@impl true +def start(_type, _args) do + :opentelemetry_cowboy.setup() + OpentelemetryPhoenix.setup(adapter: :cowboy2) + OpentelemetryEcto.setup([:demo, :repo]) + +end +``` + +  + +### Step 2: Configure Application +You need to configure your application to send telemetry data by adding the following config to your `runtime.exs` file: + +```bash +config :opentelemetry, :resource, service: %{name: "{{MYAPP}}"} + +config :opentelemetry, :processors, + otel_batch_processor: %{ + exporter: + {:opentelemetry_exporter, + %{endpoints: ["http://localhost:4318"]} + } + } +``` +  + +### Step 3: Dockerize your application + +Since the environment variables like SIGNOZ_INGESTION_KEY, Ingestion Endpoint and Service name are set in the above steps, you don't need to add any additional steps in your Dockerfile. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-runApplication.md new file mode 100644 index 000000000000..7b902502a6ed --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-runApplication.md @@ -0,0 +1,25 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` + +  + +To see some examples for instrumented applications, you can checkout [this link](https://signoz.io/docs/instrumentation/elixir/#sample-examples) \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/Docker/QuickStart/golang-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/Docker/QuickStart/golang-docker-quickStart-runApplication.md index 38e5776db750..ab7a5dbaf889 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/Docker/QuickStart/golang-docker-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/Docker/QuickStart/golang-docker-quickStart-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/Docker/Recommended/golang-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/Docker/Recommended/golang-docker-recommended-runApplication.md index 38e5776db750..ab7a5dbaf889 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/Docker/Recommended/golang-docker-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/Docker/Recommended/golang-docker-recommended-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/QuickStart/jboss-docker-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/QuickStart/jboss-docker-quickStart-instrumentApplication.md new file mode 100644 index 000000000000..e14152562c08 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/QuickStart/jboss-docker-quickStart-instrumentApplication.md @@ -0,0 +1,25 @@ +#### Requirements +- Java 8 or higher + +  + +### Dockerize your application + +Update your Dockerfile to include + +```bash +... +# Set working directory. Assuming `/opt/jboss-eap-7.1` to be your working directory. +WORKDIR /opt/jboss-eap-7.1 + +# Download otel java binary agent +RUN wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar -O opentelemetry-javaagent.jar + +# Open and update the configuration file +RUN sed -i 's/\(JAVA_OPTS=".*\)/\1 -javaagent:\/opt\/jboss-eap-7.1\/opentelemetry-javaagent.jar \ +-Dotel.exporter.otlp.endpoint=https:\/\/ingest.{{REGION}}.signoz.cloud:443 \ +-Dotel.exporter.otlp.headers="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" \ +-Dotel.resource.attributes="service.name={{MYAPP}}"/' /opt/jboss-eap-7.1/bin/standalone.conf +... +``` + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/QuickStart/jboss-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/QuickStart/jboss-docker-quickStart-runApplication.md new file mode 100644 index 000000000000..2b1a5e4a3d7b --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/QuickStart/jboss-docker-quickStart-runApplication.md @@ -0,0 +1,25 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` + +  + +If you encounter any difficulties, please consult the [troubleshooting section](https://signoz.io/docs/instrumentation/jboss/#troubleshooting-your-installation) for assistance. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-installOtelCollector.md new file mode 100644 index 000000000000..fbeda9c337a1 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-installOtelCollector.md @@ -0,0 +1,12 @@ +## Setup OpenTelemetry Binary as an agent + +  + +As a first step, you should install the OTel collector Binary according to the instructions provided on [this link](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/). + +  + +Once you are done setting up the OTel collector binary, you can follow the next steps. + +  + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-instrumentApplication.md new file mode 100644 index 000000000000..271dcf708533 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-instrumentApplication.md @@ -0,0 +1,24 @@ +After setting up the Otel collector agent, follow the steps below to instrument your JavaScript Application + +#### Requirements +- Java 8 or higher + +  + +### Dockerize your application + +Update your Dockerfile to include + +```bash +... +# Set working directory. Assuming `/opt/jboss-eap-7.1` to be your working directory. +WORKDIR /opt/jboss-eap-7.1 + +# Download otel java binary agent +RUN wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar -O opentelemetry-javaagent.jar + +# Open and update the configuration file +RUN sed -i 's/\(JAVA_OPTS=".*\)/\1 -javaagent:\/opt\/jboss-eap-7.1\/opentelemetry-javaagent.jar/' bin/standalone.conf +... +``` + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-runApplication.md new file mode 100644 index 000000000000..2b1a5e4a3d7b --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-runApplication.md @@ -0,0 +1,25 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` + +  + +If you encounter any difficulties, please consult the [troubleshooting section](https://signoz.io/docs/instrumentation/jboss/#troubleshooting-your-installation) for assistance. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/QuickStart/others-docker-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/QuickStart/others-docker-quickStart-instrumentApplication.md new file mode 100644 index 000000000000..e4c3ad3de38a --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/QuickStart/others-docker-quickStart-instrumentApplication.md @@ -0,0 +1,27 @@ +#### Requirements +- Java 8 or higher +  + +### Dockerize your application + +Add the following to your Dockerfile + +```bash +... +# Download otel java binary agent using +RUN wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar -O opentelemetry-javaagent.jar + +# Set environment variables and run your Spring Boot application +ENV OTEL_RESOURCE_ATTRIBUTES="service.name={{MYAPP}}" \ + OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" \ + OTEL_EXPORTER_OTLP_ENDPOINT="https://ingest.{{REGION}}.signoz.cloud:443" + +# Copy the Spring Boot application JAR file into the container +COPY .jar /app + +# Command to run the Spring Boot application +CMD ["java", "-javaagent:/app/opentelemetry-javaagent.jar", "-jar", "/app/.jar"] +... +``` + + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md new file mode 100644 index 000000000000..705f05ec8284 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md @@ -0,0 +1,27 @@ + +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` + +  + +If you encounter any difficulties, please consult the [troubleshooting section](https://signoz.io/docs/instrumentation/java/#troubleshooting-your-installation) for assistance. + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-installOtelCollector.md new file mode 100644 index 000000000000..fbeda9c337a1 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-installOtelCollector.md @@ -0,0 +1,12 @@ +## Setup OpenTelemetry Binary as an agent + +  + +As a first step, you should install the OTel collector Binary according to the instructions provided on [this link](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/). + +  + +Once you are done setting up the OTel collector binary, you can follow the next steps. + +  + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-instrumentApplication.md new file mode 100644 index 000000000000..cee56ab36f41 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-instrumentApplication.md @@ -0,0 +1,22 @@ +After setting up the Otel collector agent, follow the steps below to instrument your Java Application + +#### Requirements +- Java 8 or higher +  + +### Dockerize your application + +Add the following to your Dockerfile + +```bash +... +# Download otel java binary agent using +RUN wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar -O opentelemetry-javaagent.jar + +# Copy the Spring Boot application JAR file into the container +COPY .jar /app + +# Command to run the Spring Boot application +CMD ["java", "-javaagent:/app/opentelemetry-javaagent.jar", "-jar", "/app/.jar"] +... +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md new file mode 100644 index 000000000000..878344e37936 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md @@ -0,0 +1,26 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` + + +  + +If you encounter any difficulties, please consult the [troubleshooting section](https://signoz.io/docs/instrumentation/java/#troubleshooting-your-installation) for assistance. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/QuickStart/springBoot-docker-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/QuickStart/springBoot-docker-quickStart-instrumentApplication.md new file mode 100644 index 000000000000..566000f08010 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/QuickStart/springBoot-docker-quickStart-instrumentApplication.md @@ -0,0 +1,27 @@ + +#### Requirements +- Java 8 or higher + +  + +### Dockerize your application + +Add the following to your Dockerfile + +```bash +... +# Download otel java binary agent using +RUN wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar -O opentelemetry-javaagent.jar + +# Set environment variables and run your Spring Boot application +ENV OTEL_RESOURCE_ATTRIBUTES="service.name={{MYAPP}}" \ + OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" \ + OTEL_EXPORTER_OTLP_ENDPOINT="https://ingest.{{REGION}}.signoz.cloud:443" + +# Copy the Spring Boot application JAR file into the container +COPY .jar /app + +# Command to run the Spring Boot application +CMD ["java", "-javaagent:/app/opentelemetry-javaagent.jar", "-jar", "/app/.jar"] +... +``` diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/QuickStart/springBoot-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/QuickStart/springBoot-docker-quickStart-runApplication.md new file mode 100644 index 000000000000..2f7ed5f2646c --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/QuickStart/springBoot-docker-quickStart-runApplication.md @@ -0,0 +1,28 @@ + +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` + + +  + +If you encounter any difficulties, please consult the [troubleshooting section](https://signoz.io/docs/instrumentation/springboot/#troubleshooting-your-installation) for assistance. + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-installOtelCollector.md new file mode 100644 index 000000000000..fbeda9c337a1 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-installOtelCollector.md @@ -0,0 +1,12 @@ +## Setup OpenTelemetry Binary as an agent + +  + +As a first step, you should install the OTel collector Binary according to the instructions provided on [this link](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/). + +  + +Once you are done setting up the OTel collector binary, you can follow the next steps. + +  + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-instrumentApplication.md new file mode 100644 index 000000000000..396d79d18a06 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-instrumentApplication.md @@ -0,0 +1,22 @@ +After setting up the Otel collector agent, follow the steps below to instrument your Java Application + +#### Requirements +- Java 8 or higher +  + +### Dockerize your application + +Add the following to your Dockerfile + +```bash +... +# Download otel java binary agent using +RUN wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar -O opentelemetry-javaagent.jar + +# Copy the Spring Boot application JAR file into the container +COPY .jar /app + +# Command to run the Spring Boot application +CMD ["java", "-javaagent:/app/opentelemetry-javaagent.jar", "-jar", "/app/.jar"] +... +``` diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-runApplication.md new file mode 100644 index 000000000000..ed50f80d9850 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-runApplication.md @@ -0,0 +1,26 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` + + +  + +If you encounter any difficulties, please consult the [troubleshooting section](https://signoz.io/docs/instrumentation/springboot/#troubleshooting-your-installation) for assistance. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/QuickStart/tomcat-docker-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/QuickStart/tomcat-docker-quickStart-instrumentApplication.md new file mode 100644 index 000000000000..a41430deca9b --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/QuickStart/tomcat-docker-quickStart-instrumentApplication.md @@ -0,0 +1,33 @@ +#### Requirements +- Java 8 or higher +  + +### Create setenv.sh file + +Create a `setenv.sh` file in the same directory as your Dockerfile + +```bash +#!/bin/sh +export CATALINA_OPTS="$CATALINA_OPTS -javaagent:/usr/local/tomcat/opentelemetry-javaagent.jar" +export OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" +export OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443 +export OTEL_RESOURCE_ATTRIBUTES=service.name={{MYAPP}} +``` + +  + +### Dockerize your application + +Update your Dockerfile with the below commands +```bash +... +# Set working directory. Here /usr/local/tomcat is assumed to be the working directory +WORKDIR /usr/local/tomcat + +# Download otel java binary agent +RUN wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar -O opentelemetry-javaagent.jar + +# Copy setenv.sh into Tomcat bin directory of the working directory to enable the instrumentation agent +COPY setenv.sh /usr/local/tomcat/bin/ +... +``` diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/QuickStart/tomcat-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/QuickStart/tomcat-docker-quickStart-runApplication.md new file mode 100644 index 000000000000..cdfec17bdea2 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/QuickStart/tomcat-docker-quickStart-runApplication.md @@ -0,0 +1,26 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` + +  + +If you encounter any difficulties, please consult the [troubleshooting section](https://signoz.io/docs/instrumentation/tomcat/#troubleshooting-your-installation) for assistance. + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-installOtelCollector.md new file mode 100644 index 000000000000..a659f3647456 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-installOtelCollector.md @@ -0,0 +1,96 @@ +## Setup OpenTelemetry Binary as an agent +  + +### Step 1: Download otel-collector tar.gz +```bash +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +``` +  + +### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder +```bash +mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +``` +  + +### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it +```bash +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + hostmetrics: + collection_interval: 60s + scrapers: + cpu: {} + disk: {} + load: {} + filesystem: {} + memory: {} + network: {} + paging: {} + process: + mute_process_name_error: true + mute_process_exe_error: true + mute_process_io_error: true + processes: {} + prometheus: + config: + global: + scrape_interval: 60s + scrape_configs: + - job_name: otel-collector-binary + static_configs: + - targets: + # - localhost:8888 +processors: + batch: + send_batch_size: 1000 + timeout: 10s + # Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md + resourcedetection: + detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure. + # Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels. + timeout: 2s + system: + hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback +extensions: + health_check: {} + zpages: {} +exporters: + otlp: + endpoint: "ingest.{{REGION}}.signoz.cloud:443" + tls: + insecure: false + headers: + "signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}" + logging: + verbosity: normal +service: + telemetry: + metrics: + address: 0.0.0.0:8888 + extensions: [health_check, zpages] + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics/internal: + receivers: [prometheus, hostmetrics] + processors: [resourcedetection, batch] + exporters: [otlp] + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [batch] + exporters: [otlp] +``` + + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-instrumentApplication.md new file mode 100644 index 000000000000..6c4ffc92d018 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-instrumentApplication.md @@ -0,0 +1,30 @@ +After setting up the Otel collector agent, follow the steps below to instrument your Java Application + +#### Requirements +- Java 8 or higher +  + +Create a `setenv.sh` file in the same directory as your Dockerfile + +```bash +#!/bin/sh +export CATALINA_OPTS="$CATALINA_OPTS -javaagent:/usr/local/tomcat/opentelemetry-javaagent.jar" +``` + +  + +### Dockerize your application + +Update your Dockerfile with the below commands +```bash +... +# Set working directory. Here /usr/local/tomcat is assumed to be the working directory +WORKDIR /usr/local/tomcat + +# Download otel java binary agent +RUN wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar -O opentelemetry-javaagent.jar + +# Copy setenv.sh into Tomcat bin directory of the working directory to enable the instrumentation agent +COPY setenv.sh /usr/local/tomcat/bin/ +... +``` diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-runApplication.md new file mode 100644 index 000000000000..cdfec17bdea2 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-runApplication.md @@ -0,0 +1,26 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` + +  + +If you encounter any difficulties, please consult the [troubleshooting section](https://signoz.io/docs/instrumentation/tomcat/#troubleshooting-your-installation) for assistance. + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/Docker/QuickStart/express-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/Docker/QuickStart/express-docker-quickStart-runApplication.md index da54fa79da39..82463e6da90c 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/Docker/QuickStart/express-docker-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/Docker/QuickStart/express-docker-quickStart-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/Docker/Recommended/express-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/Docker/Recommended/express-docker-recommended-runApplication.md index da54fa79da39..82463e6da90c 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/Docker/Recommended/express-docker-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/Docker/Recommended/express-docker-recommended-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/Docker/QuickStart/nestjs-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/Docker/QuickStart/nestjs-docker-quickStart-runApplication.md index aaef92765cc2..4a7af5b04f31 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/Docker/QuickStart/nestjs-docker-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/Docker/QuickStart/nestjs-docker-quickStart-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/Docker/Recommended/nestjs-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/Docker/Recommended/nestjs-docker-recommended-runApplication.md index aaef92765cc2..4a7af5b04f31 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/Docker/Recommended/nestjs-docker-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/Docker/Recommended/nestjs-docker-recommended-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/Docker/QuickStart/nodejs-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/Docker/QuickStart/nodejs-docker-quickStart-runApplication.md index 04b0ad7d4913..d3711d1d1349 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/Docker/QuickStart/nodejs-docker-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/Docker/QuickStart/nodejs-docker-quickStart-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/Docker/Recommended/nodejs-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/Docker/Recommended/nodejs-docker-recommended-runApplication.md index 04b0ad7d4913..d3711d1d1349 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/Docker/Recommended/nodejs-docker-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/Docker/Recommended/nodejs-docker-recommended-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md index 04b0ad7d4913..d3711d1d1349 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md index 04b0ad7d4913..d3711d1d1349 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/Docker/QuickStart/reactjs-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/Docker/QuickStart/reactjs-docker-quickStart-runApplication.md index 0f7e5b495708..cc4ce535ffd1 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/Docker/QuickStart/reactjs-docker-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/Docker/QuickStart/reactjs-docker-quickStart-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/Docker/Recommended/reactjs-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/Docker/Recommended/reactjs-docker-recommended-runApplication.md index 0f7e5b495708..cc4ce535ffd1 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/Docker/Recommended/reactjs-docker-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/Docker/Recommended/reactjs-docker-recommended-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/QuickStart/php-docker-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/QuickStart/php-docker-quickStart-instrumentApplication.md new file mode 100644 index 000000000000..524f57338aa3 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/QuickStart/php-docker-quickStart-instrumentApplication.md @@ -0,0 +1,79 @@ +  + +### Step 1: Setup Development Environment +Add these crates just below the `[dependencies]` section of your `cargo.toml` file + +To configure our PHP application to send data, you need to use OpenTelemetry PHP extension. Since the extension is built from the source, you need to have the build tools, which can be installed using the following command: + +**Linux**: +```bash +sudo apt-get install gcc make autoconf +``` + +**MacOs(Homebrew)**: +```bash +brew install gcc make autoconf +``` + +  + +### Step 2: Build the extension + +With our environment set up we can install the extension using [PECL](https://pecl.php.net/): + +```bash +pecl install opentelemetry +``` + +After successfully installing the OpenTelemetry extension, add the extension to php.ini file of your project: + +```bash +[opentelemetry] +extension=opentelemetry.so +``` + +Verify that the extension is enabled by running: + +```bash +php -m | grep opentelemetry +``` + +Running the above command will **output**: + +```bash +opentelemetry +``` + +  + +### Step 3: Add the dependencies + +Add dependencies required to perform automatic instrumentation using this command : + +```bash +composer config allow-plugins.php-http/discovery false +composer require \ + open-telemetry/sdk \ + open-telemetry/exporter-otlp \ + php-http/guzzle7-adapter \ + open-telemetry/transport-grpc +``` + +  + +### Step 4: Dockerize your application + +Update your dockerfile to include the environment variables: + +```bash +... +# Set environment variables +ENV OTEL_PHP_AUTOLOAD_ENABLED=true \ + OTEL_SERVICE_NAME={{MYAPP}} \ + OTEL_TRACES_EXPORTER=otlp \ + OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \ + OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443 \ + OTEL_EXPORTER_OTLP_HEADERS=signoz-access-token={{SIGNOZ_INGESTION_KEY}} \ + OTEL_PROPAGATORS=baggage,tracecontext +... +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/QuickStart/php-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/QuickStart/php-docker-quickStart-runApplication.md new file mode 100644 index 000000000000..79464ee5ed97 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/QuickStart/php-docker-quickStart-runApplication.md @@ -0,0 +1,21 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-installOtelCollector.md new file mode 100644 index 000000000000..a659f3647456 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-installOtelCollector.md @@ -0,0 +1,96 @@ +## Setup OpenTelemetry Binary as an agent +  + +### Step 1: Download otel-collector tar.gz +```bash +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +``` +  + +### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder +```bash +mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +``` +  + +### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it +```bash +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + hostmetrics: + collection_interval: 60s + scrapers: + cpu: {} + disk: {} + load: {} + filesystem: {} + memory: {} + network: {} + paging: {} + process: + mute_process_name_error: true + mute_process_exe_error: true + mute_process_io_error: true + processes: {} + prometheus: + config: + global: + scrape_interval: 60s + scrape_configs: + - job_name: otel-collector-binary + static_configs: + - targets: + # - localhost:8888 +processors: + batch: + send_batch_size: 1000 + timeout: 10s + # Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md + resourcedetection: + detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure. + # Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels. + timeout: 2s + system: + hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback +extensions: + health_check: {} + zpages: {} +exporters: + otlp: + endpoint: "ingest.{{REGION}}.signoz.cloud:443" + tls: + insecure: false + headers: + "signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}" + logging: + verbosity: normal +service: + telemetry: + metrics: + address: 0.0.0.0:8888 + extensions: [health_check, zpages] + pipelines: + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics/internal: + receivers: [prometheus, hostmetrics] + processors: [resourcedetection, batch] + exporters: [otlp] + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [batch] + exporters: [otlp] +``` + + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-instrumentApplication.md new file mode 100644 index 000000000000..e05b167123f2 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-instrumentApplication.md @@ -0,0 +1,82 @@ +  + +After setting up the Otel collector agent, follow the steps below to instrument your PHP Application + +### Step 1: Setup Development Environment +Add these crates just below the `[dependencies]` section of your `cargo.toml` file + +To configure our PHP application to send data, you need to use OpenTelemetry PHP extension. Since the extension is built from the source, you need to have the build tools, which can be installed using the following command: + +**Linux**: +```bash +sudo apt-get install gcc make autoconf +``` + +  + +**MacOs(Homebrew)**: +```bash +brew install gcc make autoconf +``` + +  + +### Step 2: Build the extension + +With our environment set up we can install the extension using [PECL](https://pecl.php.net/): + +```bash +pecl install opentelemetry +``` + +After successfully installing the OpenTelemetry extension, add the extension to php.ini file of your project: + +```bash +[opentelemetry] +extension=opentelemetry.so +``` + +Verify that the extension is enabled by running: + +```bash +php -m | grep opentelemetry +``` + +Running the above command will **output**: + +```bash +opentelemetry +``` + +  + +### Step 3: Add the dependencies + +Add dependencies required to perform automatic instrumentation using this command : + +```bash +composer config allow-plugins.php-http/discovery false +composer require \ + open-telemetry/sdk \ + open-telemetry/exporter-otlp \ + php-http/guzzle7-adapter \ + open-telemetry/transport-grpc +``` + +  + +### Step 4: Dockerize your application + +Update your dockerfile to include the environment variables: + +```bash +... +# Set environment variables +ENV OTEL_PHP_AUTOLOAD_ENABLED=true \ + OTEL_SERVICE_NAME={{MYAPP}} \ + OTEL_TRACES_EXPORTER=otlp \ + OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \ + OTEL_EXPORTER_OTLP_ENDPOINT= \ + OTEL_PROPAGATORS=baggage,tracecontext +... +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-runApplication.md new file mode 100644 index 000000000000..79464ee5ed97 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-runApplication.md @@ -0,0 +1,21 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/Docker/QuickStart/django-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/Docker/QuickStart/django-docker-quickStart-runApplication.md index b8fca02afb3b..3313cd3e7797 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/Docker/QuickStart/django-docker-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/Docker/QuickStart/django-docker-quickStart-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/Docker/Recommended/django-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/Docker/Recommended/django-docker-recommended-runApplication.md index decd5061ae4e..9f8bceaf35ac 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/Docker/Recommended/django-docker-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/Docker/Recommended/django-docker-recommended-runApplication.md @@ -8,7 +8,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/Docker/QuickStart/falcon-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/Docker/QuickStart/falcon-docker-quickStart-runApplication.md index f72caf29b7e4..85c7e803d635 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/Docker/QuickStart/falcon-docker-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/Docker/QuickStart/falcon-docker-quickStart-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/Docker/Recommended/falcon-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/Docker/Recommended/falcon-docker-recommended-runApplication.md index b004b6b742b8..04edeacb9c98 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/Docker/Recommended/falcon-docker-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/Docker/Recommended/falcon-docker-recommended-runApplication.md @@ -8,7 +8,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/Docker/QuickStart/fastapi-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/Docker/QuickStart/fastapi-docker-quickStart-runApplication.md index 97ebbf19e438..14c3d362a341 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/Docker/QuickStart/fastapi-docker-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/Docker/QuickStart/fastapi-docker-quickStart-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/Docker/Recommended/fastapi-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/Docker/Recommended/fastapi-docker-recommended-runApplication.md index 8d6a6148681d..ff5d2bc7d69a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/Docker/Recommended/fastapi-docker-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/Docker/Recommended/fastapi-docker-recommended-runApplication.md @@ -8,7 +8,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/Docker/QuickStart/flask-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/Docker/QuickStart/flask-docker-quickStart-runApplication.md index 51f27ecaa928..3acec0c7754c 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/Docker/QuickStart/flask-docker-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/Docker/QuickStart/flask-docker-quickStart-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/Docker/Recommended/flask-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/Docker/Recommended/flask-docker-recommended-runApplication.md index a392f07fc210..89284f84bbaa 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/Docker/Recommended/flask-docker-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/Docker/Recommended/flask-docker-recommended-runApplication.md @@ -8,7 +8,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md index 53343fa324ac..5f1e39498c81 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md @@ -10,7 +10,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md index da1e37678937..8c91af0742d4 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md @@ -8,7 +8,7 @@ Build your docker image docker build -t . ``` -- `<` is the name of your Docker Image +- `` is the name of your Docker Image   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/QuickStart/ror-docker-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/QuickStart/ror-docker-quickStart-instrumentApplication.md new file mode 100644 index 000000000000..f4bd7b9ca294 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/QuickStart/ror-docker-quickStart-instrumentApplication.md @@ -0,0 +1,54 @@ +  + +### Step 1: Install dependencies +Install dependencies related to OpenTelemetry SDK and exporter using gem +```bash +gem install opentelemetry-sdk +gem install opentelemetry-exporter-otlp +gem install opentelemetry-instrumentation-all +``` +  + +Include the required packages into your gemfile +```bash +gem 'opentelemetry-sdk' +gem 'opentelemetry-exporter-otlp' +gem 'opentelemetry-instrumentation-all' +``` +  + +Run the bundle install command: +```bash +bundle install +``` +  + +### Step 2: Initialize the OpenTelemetry SDK +Initialize the otel sdk by adding below lines to `config/environment.rb` of your Ruby on Rails application + +```bash +require 'opentelemetry/sdk' +require_relative 'application' + +OpenTelemetry::SDK.configure do |c| + c.use_all +end + +Rails.application.initialize! +``` + +  + +### Step 3: Dockerize your application + +Update your dockerfile to include the environment variables: + +```bash +... +# Set environment variables +ENV OTEL_EXPORTER=otlp \ + OTEL_SERVICE_NAME={{MYAPP}} \ + OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443 \ + OTEL_EXPORTER_OTLP_HEADERS=signoz-access-token={{SIGNOZ_INGESTION_KEY}} +... +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/QuickStart/ror-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/QuickStart/ror-docker-quickStart-runApplication.md new file mode 100644 index 000000000000..79464ee5ed97 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/QuickStart/ror-docker-quickStart-runApplication.md @@ -0,0 +1,21 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-installOtelCollector.md new file mode 100644 index 000000000000..fbeda9c337a1 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-installOtelCollector.md @@ -0,0 +1,12 @@ +## Setup OpenTelemetry Binary as an agent + +  + +As a first step, you should install the OTel collector Binary according to the instructions provided on [this link](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/). + +  + +Once you are done setting up the OTel collector binary, you can follow the next steps. + +  + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-instrumentApplication.md new file mode 100644 index 000000000000..a8b5d7b48e95 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-instrumentApplication.md @@ -0,0 +1,57 @@ +  + +After setting up the Otel collector agent, follow the steps below to instrument your Ruby On Rails Application + +  + +### Step 1: Install dependencies +Install dependencies related to OpenTelemetry SDK and exporter using gem +```bash +gem install opentelemetry-sdk +gem install opentelemetry-exporter-otlp +gem install opentelemetry-instrumentation-all +``` +  + +Include the required packages into your gemfile +```bash +gem 'opentelemetry-sdk' +gem 'opentelemetry-exporter-otlp' +gem 'opentelemetry-instrumentation-all' +``` +  + +Run the bundle install command: +```bash +bundle install +``` +  + +### Step 2: Initialize the OpenTelemetry SDK +Initialize the otel sdk by adding below lines to `config/environment.rb` of your Ruby on Rails application + +```bash +require 'opentelemetry/sdk' +require_relative 'application' + +OpenTelemetry::SDK.configure do |c| + c.use_all +end + +Rails.application.initialize! +``` + +  + +### Step 3: Dockerize your application + +Update your dockerfile to include the environment variables: + +```bash +... +# Set environment variables +ENV OTEL_EXPORTER=otlp \ + OTEL_SERVICE_NAME={{MYAPP}} \ + OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 +... +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-runApplication.md new file mode 100644 index 000000000000..79464ee5ed97 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-runApplication.md @@ -0,0 +1,21 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/QuickStart/rust-docker-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/QuickStart/rust-docker-quickStart-instrumentApplication.md new file mode 100644 index 000000000000..7061dabd38e6 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/QuickStart/rust-docker-quickStart-instrumentApplication.md @@ -0,0 +1,146 @@ +  + +### Step 1: Add dependencies +Add these crates just below the `[dependencies]` section of your `cargo.toml` file + +```rust +opentelemetry = { version = "0.18.0", features = ["rt-tokio", "metrics", "trace"] } +opentelemetry-otlp = { version = "0.11.0", features = ["trace", "metrics"] } +opentelemetry-semantic-conventions = { version = "0.10.0" } +opentelemetry-proto = { version = "0.1.0"} +tokio = { version = "1", features = ["full"] } +tonic = { version = "0.8.2", features = ["tls-roots"] } +dotenv = "0.15.0" +``` +  + +Use the above crates in entry point of your Rust application, which is generally your `main.rs` file + +```rust +use dotenv::dotenv; +use opentelemetry::global::shutdown_tracer_provider; +use opentelemetry::sdk::Resource; +use opentelemetry::trace::TraceError; +use opentelemetry::{ + global, sdk::trace as sdktrace, + trace::{TraceContextExt, Tracer}, + Context, Key, KeyValue, +}; +use opentelemetry_otlp::WithExportConfig; +use tonic::metadata::{MetadataMap, MetadataValue}; +``` +  + +### Step 2: Initialize tracer and create env file +Add `init_tracer` function to your `main.rs` file. It initializes an OpenTelemetry tracer with the OpenTelemetry OTLP exporter which is sending data to SigNoz Cloud. + +```rust +fn init_tracer() -> Result { + let signoz_access_token = std::env::var("SIGNOZ_ACCESS_TOKEN").expect("SIGNOZ_ACCESS_TOKEN not set"); + let mut metadata = MetadataMap::new(); + metadata.insert( + "signoz-access-token", + MetadataValue::from_str(&signoz_access_token).unwrap(), + ); + opentelemetry_otlp::new_pipeline() + .tracing() + .with_exporter( + opentelemetry_otlp::new_exporter() + .tonic() + .with_metadata(metadata) + .with_endpoint(std::env::var("SIGNOZ_ENDPOINT").expect("SIGNOZ_ENDPOINT not set")), + ) + .with_trace_config( + sdktrace::config().with_resource(Resource::new(vec![ + KeyValue::new( + opentelemetry_semantic_conventions::resource::SERVICE_NAME, + std::env::var("APP_NAME").expect("APP_NAME not set"), + ), + ])), + ) + .install_batch(opentelemetry::runtime::Tokio) +} +``` + +After adding the above function in your `main.rs` file, create an `.env` file in root of your app. The structure could look like this : + +```bash +project_root/ +|-- Cargo.toml +|-- src/ +| |-- main.rs +|-- .env +``` + +In your environment file, paste the below variables which will be used in the next steps. + +```rust +PORT=3000 // If it is a web app pass port or else you can ignore this variable +APP_NAME={{MYAPP}} +SIGNOZ_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443/v1/traces +SIGNOZ_ACCESS_TOKEN={{SIGNOZ_INGESTION_KEY}} +``` + +### Step 3: Add OpenTelemetry instrumentation + + +Call the `init_tracer` function inside `main()` at starting so that as soon as your rust application starts, tracer will be available globally. + +```rust +dotenv().ok(); +let _ = init_tracer(); +``` + +Modify your `main()` function from + +```rust +fn main(){ + //rest of the code +} +``` + +  + +to + +```rust +#[tokio::main] +async fn main() { + //rest of the code +} +``` + +Add the below code block within a function or a section of your code where you're setting up and using the tracer for distributed tracing. After adding the below code block you can send traces to SigNoz Cloud + +```rust + let tracer = global::tracer("global_tracer"); + let _cx = Context::new(); + + tracer.in_span("operation", |cx| { + let span = cx.span(); + span.set_attribute(Key::new("KEY").string("value")); + + span.add_event( + format!("Operations"), + vec![ + Key::new("SigNoz is").string("working!"), + ], + ); + }); + shutdown_tracer_provider() +``` + +The above code block will create a span named operation which sets an attribute and an event to it saying "SigNoz is working!". + +  + +### Step 4: Dockerize your application + +Update your Dockerfile to include the `.env` file created above + +```bash +... +# Copy your .env file +COPY .env . +... +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/QuickStart/rust-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/QuickStart/rust-docker-quickStart-runApplication.md new file mode 100644 index 000000000000..ab7a5dbaf889 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/QuickStart/rust-docker-quickStart-runApplication.md @@ -0,0 +1,21 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-installOtelCollector.md new file mode 100644 index 000000000000..fbeda9c337a1 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-installOtelCollector.md @@ -0,0 +1,12 @@ +## Setup OpenTelemetry Binary as an agent + +  + +As a first step, you should install the OTel collector Binary according to the instructions provided on [this link](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/). + +  + +Once you are done setting up the OTel collector binary, you can follow the next steps. + +  + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-instrumentApplication.md new file mode 100644 index 000000000000..05fbf39c7554 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-instrumentApplication.md @@ -0,0 +1,112 @@ +  + +After setting up the Otel collector agent, follow the steps below to instrument your Rust Application + +### Step 1: Add dependencies +Add these crates just below the `[dependencies]` section of your `cargo.toml` file + +```rust +opentelemetry = { version = "0.18.0", features = ["rt-tokio", "metrics", "trace"] } +opentelemetry-otlp = { version = "0.11.0", features = ["trace", "metrics"] } +opentelemetry-semantic-conventions = { version = "0.10.0" } +opentelemetry-proto = { version = "0.1.0"} +tokio = { version = "1", features = ["full"] } +tonic = { version = "0.8.2", features = ["tls-roots"] } +``` +  + +Use the above crates in entry point of your Rust application, which is generally your `main.rs` file + +```rust +use opentelemetry::global::shutdown_tracer_provider; +use opentelemetry::sdk::Resource; +use opentelemetry::trace::TraceError; +use opentelemetry::{ + global, sdk::trace as sdktrace, + trace::{TraceContextExt, Tracer}, + Context, Key, KeyValue, +}; +use opentelemetry_otlp::WithExportConfig; +use tonic::metadata::{MetadataMap, MetadataValue}; +``` +  + +### Step 2: Initialize tracer +Add `init_tracer` function to your `main.rs` file. It initializes an OpenTelemetry tracer with the OpenTelemetry OTLP exporter which is sending data to SigNoz Cloud. + +```rust +fn init_tracer() -> Result { + opentelemetry_otlp::new_pipeline() + .tracing() + .with_exporter(opentelemetry_otlp::new_exporter().tonic().with_env()) + .with_trace_config( + sdktrace::config().with_resource(Resource::default()), + ) + .install_batch(opentelemetry::runtime::Tokio) +} +``` +### Step 3: Add OpenTelemetry instrumentation + +Call the `init_tracer` function inside `main()` at starting so that as soon as your rust application starts, tracer will be available globally. + +```rust + let _ = init_tracer(); +``` + +Modify your `main()` function from + +```rust +fn main(){ + //rest of the code +} +``` + +  + +to + +```rust +#[tokio::main] +async fn main() { + //rest of the code +} +``` + +Add the below code block within a function or a section of your code where you're setting up and using the tracer for distributed tracing. After adding the below code block you can send traces to SigNoz Cloud + +```rust + let tracer = global::tracer("global_tracer"); + let _cx = Context::new(); + + tracer.in_span("operation", |cx| { + let span = cx.span(); + span.set_attribute(Key::new("KEY").string("value")); + + span.add_event( + format!("Operations"), + vec![ + Key::new("SigNoz is").string("working!"), + ], + ); + }); + shutdown_tracer_provider() +``` + +The above code block will create a span named operation which sets an attribute and an event to it saying "SigNoz is working!". + + +  + +### Step 4: Dockerize your application + +Update your Dockerfile with the Environment variables as follows: + +```bash + +... +# Set necessary environment variables +ENV OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 \ + OTEL_RESOURCE_ATTRIBUTES=service.name={{MYAPP}} +... + +``` \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-runApplication.md new file mode 100644 index 000000000000..ab7a5dbaf889 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-runApplication.md @@ -0,0 +1,21 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/QuickStart/swift-docker-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/QuickStart/swift-docker-quickStart-instrumentApplication.md new file mode 100644 index 000000000000..800e96439d4b --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/QuickStart/swift-docker-quickStart-instrumentApplication.md @@ -0,0 +1,71 @@ +  + +### Step 1: Add dependencies + +To configure your Swift application to send data you need to initialize OpenTelemetry. Add these dependency in `Package.swift` file of your project or if you are using XCode then you need to add this [dependency](https://github.com/open-telemetry/opentelemetry-swift) and then import these below dependencies in the main file. + +```swift +import Foundation +import GRPC +import NIO +import NIOSSL +import OpenTelemetryApi +import OpenTelemetryProtocolExporterCommon +import OpenTelemetryProtocolExporterGrpc +import OpenTelemetrySdk +import ResourceExtension +import SignPostIntegration +import StdoutExporter +import ZipkinExporter +``` + +  + +### Step 2: Initialize tracer +Initialize the tracer using the code block below in the `main.swift` file inside the main function or you can create another function for initializing the tracer and call it in some other block of code. + +```swift +var resources = DefaultResources().get() + +let instrumentationScopeName = "{{MYAPP}}" +let instrumentationScopeVersion = "semver:0.1.0" + +let otlpConfiguration: OtlpConfiguration = OtlpConfiguration(timeout: TimeInterval(10), headers: [("signoz-access-token", {{SIGNOZ_INGESTION_KEY}})]) + +let grpcChannel = ClientConnection.usingPlatformAppropriateTLS(for: MultiThreadedEventLoopGroup(numberOfThreads:1)).connect(host: "https://ingest.{{REGION}}.signoz.cloud:443", port: 443) + +let otlpTraceExporter = OtlpTraceExporter(channel: grpcChannel, + config: otlpConfiguration) +let stdoutExporter = StdoutExporter() + +let spanExporter = MultiSpanExporter(spanExporters: [otlpTraceExporter, stdoutExporter]) + +let spanProcessor = SimpleSpanProcessor(spanExporter: spanExporter) +OpenTelemetry.registerTracerProvider(tracerProvider: + TracerProviderBuilder() + .add(spanProcessor: spanProcessor) + .build() +) +``` + + +### Step 3: Add OpenTelemetry instrumentation + +```swift +func doWork() { + let childSpan = tracer.spanBuilder(spanName: "doWork").setSpanKind(spanKind: .client).startSpan() + childSpan.setAttribute(key: sampleKey, value: sampleValue) + Thread.sleep(forTimeInterval: Double.random(in: 0 ..< 10) / 100) + childSpan.end() +} +``` + +  + +If you call this `doWork` function, it will add a trace with span name "doWork" and attributes with key-value pair. You can modify this function according to your needs. + +  + +### Step 4: Dockerize your application + +Since the environment variables like SIGNOZ_INGESTION_KEY, Ingestion URL and Service name are set in the `main.swift` file, you don't need to add any additional steps in your Dockerfile. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/QuickStart/swift-docker-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/QuickStart/swift-docker-quickStart-runApplication.md new file mode 100644 index 000000000000..ab7a5dbaf889 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/QuickStart/swift-docker-quickStart-runApplication.md @@ -0,0 +1,21 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-installOtelCollector.md new file mode 100644 index 000000000000..fbeda9c337a1 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-installOtelCollector.md @@ -0,0 +1,12 @@ +## Setup OpenTelemetry Binary as an agent + +  + +As a first step, you should install the OTel collector Binary according to the instructions provided on [this link](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/). + +  + +Once you are done setting up the OTel collector binary, you can follow the next steps. + +  + diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-instrumentApplication.md new file mode 100644 index 000000000000..85b2f30d890d --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-instrumentApplication.md @@ -0,0 +1,76 @@ +  + +After setting up the Otel collector agent, follow the steps below to instrument your Swift Application + +### Step 1: Add dependencies + +To configure your Swift application to send data you need to initialize OpenTelemetry. Add these dependency in `Package.swift` file of your project or if you are using XCode then you need to add this [dependency](https://github.com/open-telemetry/opentelemetry-swift) and then import these below dependencies in the main file. + +```swift +import Foundation +import GRPC +import NIO +import NIOSSL +import OpenTelemetryApi +import OpenTelemetryProtocolExporterCommon +import OpenTelemetryProtocolExporterGrpc +import OpenTelemetrySdk +import ResourceExtension +import SignPostIntegration +import StdoutExporter +import ZipkinExporter +``` + +  + +### Step 2: Initialize tracer +Initialize the tracer using the code block below in the `main.swift` file inside the main function or you can create another function for initializing the tracer and call it in some other block of code. + +```swift +var resources = DefaultResources().get() + +let instrumentationScopeName = "{{MYAPP}}" +let instrumentationScopeVersion = "semver:0.1.0" + +let otlpConfiguration: OtlpConfiguration = OtlpConfiguration(timeout: TimeInterval(10)) + +let grpcChannel = ClientConnection.usingPlatformAppropriateTLS(for: MultiThreadedEventLoopGroup(numberOfThreads:1)).connect(host: , port: 4317) + +let otlpTraceExporter = OtlpTraceExporter(channel: grpcChannel, + config: otlpConfiguration) +let stdoutExporter = StdoutExporter() + +let spanExporter = MultiSpanExporter(spanExporters: [otlpTraceExporter, stdoutExporter]) + +let spanProcessor = SimpleSpanProcessor(spanExporter: spanExporter) +OpenTelemetry.registerTracerProvider(tracerProvider: + TracerProviderBuilder() + .add(spanProcessor: spanProcessor) + .build() +) +``` +- - The endpoint where Otel Collector is running. For ex -> "localhost" + + + + +### Step 3: Add OpenTelemetry instrumentation + +```swift +func doWork() { + let childSpan = tracer.spanBuilder(spanName: "doWork").setSpanKind(spanKind: .client).startSpan() + childSpan.setAttribute(key: sampleKey, value: sampleValue) + Thread.sleep(forTimeInterval: Double.random(in: 0 ..< 10) / 100) + childSpan.end() +} +``` + +  + +If you call this `doWork` function, it will add a trace with span name "doWork" and attributes with key-value pair. You can modify this function according to your needs. + +  + +### Step 4: Dockerize your application + +Since the environment variables like SIGNOZ_INGESTION_KEY, Ingestion URL and Service name are set in the `main.swift` file, you don't need to add any additional steps in your Dockerfile. \ No newline at end of file diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-runApplication.md new file mode 100644 index 000000000000..ab7a5dbaf889 --- /dev/null +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-runApplication.md @@ -0,0 +1,21 @@ +Once you update your Dockerfile, you can build and run it using the commands below. + +  + +### Step 1: Build your dockerfile + +Build your docker image + +```bash +docker build -t . +``` + +- `` is the name of your Docker Image + +  + +### Step 2: Run your docker image + +```bash +docker run +``` diff --git a/frontend/src/container/OnboardingContainer/constants/apmDocFilePaths.ts b/frontend/src/container/OnboardingContainer/constants/apmDocFilePaths.ts index 485a33382c10..f88f39518f40 100644 --- a/frontend/src/container/OnboardingContainer/constants/apmDocFilePaths.ts +++ b/frontend/src/container/OnboardingContainer/constants/apmDocFilePaths.ts @@ -9,6 +9,13 @@ // Go-Kubernetes /// /// ROR Done /// /// .NET Start +// dotnet Docker +import APM_dotnet_docker_quickStart_instrumentApplication from '../Modules/APM/Dotnet/md-docs/Docker/QuickStart/dotnet-docker-quickStart-instrumentApplication.md'; +import APM_dotnet_docker_quickStart_runApplication from '../Modules/APM/Dotnet/md-docs/Docker/QuickStart/dotnet-docker-quickStart-runApplication.md'; +// dotnet-LinuxAMD64-recommended +import APM_dotnet_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Dotnet/md-docs/Docker/Recommended/dotnet-docker-recommended-installOtelCollector.md'; +import APM_dotnet_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Dotnet/md-docs/Docker/Recommended/dotnet-docker-recommended-instrumentApplication.md'; +import APM_dotnet_docker_recommendedSteps_runApplication from '../Modules/APM/Dotnet/md-docs/Docker/Recommended/dotnet-docker-recommended-runApplication.md'; // dotnet-Kubernetes import APM_dotnet_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-installOtelCollector.md'; import APM_dotnet_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Dotnet/md-docs/Kubernetes/dotnet-kubernetes-instrumentApplication.md'; @@ -41,6 +48,13 @@ import APM_dotnet_macOsARM64_quickStart_runApplication from '../Modules/APM/Dotn import APM_dotnet_macOsARM64_recommendedSteps_setupOtelCollector from '../Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-installOtelCollector.md'; import APM_dotnet_macOsARM64_recommendedSteps_instrumentApplication from '../Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-instrumentApplication.md'; import APM_dotnet_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-runApplication.md'; +// Elixir Docker +import APM_elixir_docker_quickStart_instrumentApplication from '../Modules/APM/Elixir/md-docs/Docker/QuickStart/elixir-docker-quickStart-instrumentApplication.md'; +import APM_elixir_docker_quickStart_runApplication from '../Modules/APM/Elixir/md-docs/Docker/QuickStart/elixir-docker-quickStart-runApplication.md'; +// Elixir-LinuxAMD64-recommended +import APM_elixir_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-installOtelCollector.md'; +import APM_elixir_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-instrumentApplication.md'; +import APM_elixir_docker_recommendedSteps_runApplication from '../Modules/APM/Elixir/md-docs/Docker/Recommended/elixir-docker-recommended-runApplication.md'; // Elixir-Kubernetes import APM_elixir_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Elixir/md-docs/Kubernetes/elixir-kubernetes-installOtelCollector.md'; import APM_elixir_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Elixir/md-docs/Kubernetes/elixir-kubernetes-instrumentApplication.md'; @@ -73,6 +87,14 @@ import APM_elixir_macOsARM64_quickStart_runApplication from '../Modules/APM/Elix import APM_elixir_macOsARM64_recommendedSteps_setupOtelCollector from '../Modules/APM/Elixir/md-docs/MacOsARM64/Recommended/elixir-macosarm64-recommended-installOtelCollector.md'; import APM_elixir_macOsARM64_recommendedSteps_instrumentApplication from '../Modules/APM/Elixir/md-docs/MacOsARM64/Recommended/elixir-macosarm64-recommended-instrumentApplication.md'; import APM_elixir_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Elixir/md-docs/MacOsARM64/Recommended/elixir-macosarm64-recommended-runApplication.md'; +// Golang Docker +import APM_go_docker_quickStart_instrumentApplication from '../Modules/APM/GoLang/md-docs/Docker/QuickStart/golang-docker-quickStart-instrumentApplication.md'; +import APM_go_docker_quickStart_runApplication from '../Modules/APM/GoLang/md-docs/Docker/QuickStart/golang-docker-quickStart-runApplication.md'; +// Go-LinuxAMD64-recommended +import APM_go_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/GoLang/md-docs/Docker/Recommended/golang-docker-recommended-installOtelCollector.md'; +import APM_go_docker_recommendedSteps_instrumentApplication from '../Modules/APM/GoLang/md-docs/Docker/Recommended/golang-docker-recommended-instrumentApplication.md'; +import APM_go_docker_recommendedSteps_runApplication from '../Modules/APM/GoLang/md-docs/Docker/Recommended/golang-docker-recommended-runApplication.md'; +// Golang Kubernetes import APM_go_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/GoLang/md-docs/Kubernetes/golang-kubernetes-installOtelCollector.md'; import APM_go_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/GoLang/md-docs/Kubernetes/golang-kubernetes-instrumentApplication.md'; import APM_go_kubernetes_recommendedSteps_runApplication from '../Modules/APM/GoLang/md-docs/Kubernetes/golang-kubernetes-runApplication.md'; @@ -105,6 +127,13 @@ import APM_go_macOsARM64_recommendedSteps_setupOtelCollector from '../Modules/AP import APM_go_macOsARM64_recommendedSteps_instrumentApplication from '../Modules/APM/GoLang/md-docs/MacOsARM64/Recommended/golang-macosarm64-recommended-instrumentApplication.md'; import APM_go_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/GoLang/md-docs/MacOsARM64/Recommended/golang-macosarm64-recommended-runApplication.md'; // ---------------------------------------------------------------------------- +// JBoss DOcker +import APM_java_jboss_docker_quickStart_instrumentApplication from '../Modules/APM/Java/md-docs/Jboss/Docker/QuickStart/jboss-docker-quickStart-instrumentApplication.md'; +import APM_java_jboss_docker_quickStart_runApplication from '../Modules/APM/Java/md-docs/Jboss/Docker/QuickStart/jboss-docker-quickStart-runApplication.md'; +// Jboss-LinuxAMD64-recommended +import APM_java_jboss_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-installOtelCollector.md'; +import APM_java_jboss_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-instrumentApplication.md'; +import APM_java_jboss_docker_recommendedSteps_runApplication from '../Modules/APM/Java/md-docs/Jboss/Docker/Recommended/jboss-docker-recommended-runApplication.md'; // Jboss-Kubernetes import APM_java_jboss_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Java/md-docs/Jboss/Kubernetes/jboss-kubernetes-installOtelCollector.md'; import APM_java_jboss_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Java/md-docs/Jboss/Kubernetes/jboss-kubernetes-instrumentApplication.md'; @@ -138,6 +167,13 @@ import APM_java_jboss_macOsARM64_recommendedSteps_setupOtelCollector from '../Mo import APM_java_jboss_macOsARM64_recommendedSteps_instrumentApplication from '../Modules/APM/Java/md-docs/Jboss/MacOsARM64/Recommended/jboss-macosarm64-recommended-instrumentApplication.md'; import APM_java_jboss_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Java/md-docs/Jboss/MacOsARM64/Recommended/jboss-macosarm64-recommended-runApplication.md'; // ---------------------------------------------------------------------------- +// Other Docker +import APM_java_other_docker_quickStart_instrumentApplication from '../Modules/APM/Java/md-docs/Others/Docker/QuickStart/others-docker-quickStart-instrumentApplication.md'; +import APM_java_other_docker_quickStart_runApplication from '../Modules/APM/Java/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md'; +// Other-LinuxAMD64-recommended +import APM_java_other_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-installOtelCollector.md'; +import APM_java_other_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-instrumentApplication.md'; +import APM_java_other_docker_recommendedSteps_runApplication from '../Modules/APM/Java/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md'; // Other-Kubernetes import APM_java_other_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Java/md-docs/Others/Kubernetes/others-kubernetes-installOtelCollector.md'; import APM_java_other_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Java/md-docs/Others/Kubernetes/others-kubernetes-instrumentApplication.md'; @@ -170,6 +206,14 @@ import APM_java_other_macOsARM64_quickStart_runApplication from '../Modules/APM/ import APM_java_other_macOsARM64_recommendedSteps_setupOtelCollector from '../Modules/APM/Java/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-installOtelCollector.md'; import APM_java_other_macOsARM64_recommendedSteps_instrumentApplication from '../Modules/APM/Java/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-instrumentApplication.md'; import APM_java_other_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Java/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-runApplication.md'; +// SpringBoot Docker +import APM_java_springBoot_docker_quickStart_instrumentApplication from '../Modules/APM/Java/md-docs/SpringBoot/Docker/QuickStart/springBoot-docker-quickStart-instrumentApplication.md'; +import APM_java_springBoot_docker_quickStart_runApplication from '../Modules/APM/Java/md-docs/SpringBoot/Docker/QuickStart/springBoot-docker-quickStart-runApplication.md'; +// SpringBoot-LinuxAMD64-recommended +import APM_java_springBoot_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-installOtelCollector.md'; +import APM_java_springBoot_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-instrumentApplication.md'; +import APM_java_springBoot_docker_recommendedSteps_runApplication from '../Modules/APM/Java/md-docs/SpringBoot/Docker/Recommended/springBoot-docker-recommended-runApplication.md'; +// SpringBoot-Kubernetes import APM_java_springBoot_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Java/md-docs/SpringBoot/Kubernetes/springBoot-kubernetes-installOtelCollector.md'; import APM_java_springBoot_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Java/md-docs/SpringBoot/Kubernetes/springBoot-kubernetes-instrumentApplication.md'; import APM_java_springBoot_kubernetes_recommendedSteps_runApplication from '../Modules/APM/Java/md-docs/SpringBoot/Kubernetes/springBoot-kubernetes-runApplication.md'; @@ -202,6 +246,13 @@ import APM_java_springBoot_macOsARM64_recommendedSteps_setupOtelCollector from ' import APM_java_springBoot_macOsARM64_recommendedSteps_instrumentApplication from '../Modules/APM/Java/md-docs/SpringBoot/MacOsARM64/Recommended/springBoot-macosarm64-recommended-instrumentApplication.md'; import APM_java_springBoot_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Java/md-docs/SpringBoot/MacOsARM64/Recommended/springBoot-macosarm64-recommended-runApplication.md'; // ---------------------------------------------------------------------------- +// Tomcat Docker +import APM_java_tomcat_docker_quickStart_instrumentApplication from '../Modules/APM/Java/md-docs/Tomcat/Docker/QuickStart/tomcat-docker-quickStart-instrumentApplication.md'; +import APM_java_tomcat_docker_quickStart_runApplication from '../Modules/APM/Java/md-docs/Tomcat/Docker/QuickStart/tomcat-docker-quickStart-runApplication.md'; +// Tomcat-LinuxAMD64-recommended +import APM_java_tomcat_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-installOtelCollector.md'; +import APM_java_tomcat_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-instrumentApplication.md'; +import APM_java_tomcat_docker_recommendedSteps_runApplication from '../Modules/APM/Java/md-docs/Tomcat/Docker/Recommended/tomcat-docker-recommended-runApplication.md'; // Tomcat-Kubernetes import APM_java_tomcat_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Java/md-docs/Tomcat/Kubernetes/tomcat-kubernetes-installOtelCollector.md'; import APM_java_tomcat_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Java/md-docs/Tomcat/Kubernetes/tomcat-kubernetes-instrumentApplication.md'; @@ -238,6 +289,13 @@ import APM_java_tomcat_macOsARM64_recommendedSteps_runApplication from '../Modul /// ////// Python Done /// ///// JavaScript Start // Express +// Express Docker +import APM_javascript_express_docker_quickStart_instrumentApplication from '../Modules/APM/Javascript/md-docs/Express/Docker/QuickStart/express-docker-quickStart-instrumentApplication.md'; +import APM_javascript_express_docker_quickStart_runApplication from '../Modules/APM/Javascript/md-docs/Express/Docker/QuickStart/express-docker-quickStart-runApplication.md'; +// Express-LinuxAMD64-recommended +import APM_javascript_express_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Javascript/md-docs/Express/Docker/Recommended/express-docker-recommended-installOtelCollector.md'; +import APM_javascript_express_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Javascript/md-docs/Express/Docker/Recommended/express-docker-recommended-instrumentApplication.md'; +import APM_javascript_express_docker_recommendedSteps_runApplication from '../Modules/APM/Javascript/md-docs/Express/Docker/Recommended/express-docker-recommended-runApplication.md'; // Express-Kubernetes import APM_javascript_express_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Javascript/md-docs/Express/Kubernetes/express-kubernetes-installOtelCollector.md'; import APM_javascript_express_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Javascript/md-docs/Express/Kubernetes/express-kubernetes-instrumentApplication.md'; @@ -272,6 +330,13 @@ import APM_javascript_express_macOsARM64_recommendedSteps_instrumentApplication import APM_javascript_express_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Javascript/md-docs/Express/MacOsARM64/Recommended/express-macosarm64-recommended-runApplication.md'; // ---------------------------------------------------------------------------- // NestJS +// NestJS Docker +import APM_javascript_nestjs_docker_quickStart_instrumentApplication from '../Modules/APM/Javascript/md-docs/NestJS/Docker/QuickStart/nestjs-docker-quickStart-instrumentApplication.md'; +import APM_javascript_nestjs_docker_quickStart_runApplication from '../Modules/APM/Javascript/md-docs/NestJS/Docker/QuickStart/nestjs-docker-quickStart-runApplication.md'; +// NestJS-LinuxAMD64-recommended +import APM_javascript_nestjs_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Javascript/md-docs/NestJS/Docker/Recommended/nestjs-docker-recommended-installOtelCollector.md'; +import APM_javascript_nestjs_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Javascript/md-docs/NestJS/Docker/Recommended/nestjs-docker-recommended-instrumentApplication.md'; +import APM_javascript_nestjs_docker_recommendedSteps_runApplication from '../Modules/APM/Javascript/md-docs/NestJS/Docker/Recommended/nestjs-docker-recommended-runApplication.md'; // NestJS-Kubernetes import APM_javascript_nestjs_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Javascript/md-docs/NestJS/Kubernetes/nestjs-kubernetes-installOtelCollector.md'; import APM_javascript_nestjs_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Javascript/md-docs/NestJS/Kubernetes/nestjs-kubernetes-instrumentApplication.md'; @@ -306,6 +371,13 @@ import APM_javascript_nestjs_macOsARM64_recommendedSteps_instrumentApplication f import APM_javascript_nestjs_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Javascript/md-docs/NestJS/MacOsARM64/Recommended/nestjs-macosarm64-recommended-runApplication.md'; // ---------------------------------------------------------------------------- // NodeJS +// NodeJS Docker +import APM_javascript_nodejs_docker_quickStart_instrumentApplication from '../Modules/APM/Javascript/md-docs/NodeJS/Docker/QuickStart/nodejs-docker-quickStart-instrumentApplication.md'; +import APM_javascript_nodejs_docker_quickStart_runApplication from '../Modules/APM/Javascript/md-docs/NodeJS/Docker/QuickStart/nodejs-docker-quickStart-runApplication.md'; +// NodeJS-LinuxAMD64-recommended +import APM_javascript_nodejs_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Javascript/md-docs/NodeJS/Docker/Recommended/nodejs-docker-recommended-installOtelCollector.md'; +import APM_javascript_nodejs_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Javascript/md-docs/NodeJS/Docker/Recommended/nodejs-docker-recommended-instrumentApplication.md'; +import APM_javascript_nodejs_docker_recommendedSteps_runApplication from '../Modules/APM/Javascript/md-docs/NodeJS/Docker/Recommended/nodejs-docker-recommended-runApplication.md'; // NodeJS-Kubernetes import APM_javascript_nodejs_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Javascript/md-docs/NodeJS/Kubernetes/nodejs-kubernetes-installOtelCollector.md'; import APM_javascript_nodejs_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Javascript/md-docs/NodeJS/Kubernetes/nodejs-kubernetes-instrumentApplication.md'; @@ -339,6 +411,14 @@ import APM_javascript_nodejs_macOsARM64_recommendedSteps_setupOtelCollector from import APM_javascript_nodejs_macOsARM64_recommendedSteps_instrumentApplication from '../Modules/APM/Javascript/md-docs/NodeJS/MacOsARM64/Recommended/nodejs-macosarm64-recommended-instrumentApplication.md'; import APM_javascript_nodejs_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Javascript/md-docs/NodeJS/MacOsARM64/Recommended/nodejs-macosarm64-recommended-runApplication.md'; /// // JavaScript Others +// Others Docker +import APM_javascript_others_docker_quickStart_instrumentApplication from '../Modules/APM/Javascript/md-docs/Others/Docker/QuickStart/others-docker-quickStart-instrumentApplication.md'; +import APM_javascript_others_docker_quickStart_runApplication from '../Modules/APM/Javascript/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md'; +// // Others-JavaScript-LinuxAMD64-recommended +import APM_javascript_others_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Javascript/md-docs/Others/Docker/Recommended/others-docker-recommended-installOtelCollector.md'; +import APM_javascript_others_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Javascript/md-docs/Others/Docker/Recommended/others-docker-recommended-instrumentApplication.md'; +import APM_javascript_others_docker_recommendedSteps_runApplication from '../Modules/APM/Javascript/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md'; +// Kubernetes import APM_javascript_others_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Javascript/md-docs/Others/Kubernetes/others-kubernetes-installOtelCollector.md'; import APM_javascript_others_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Javascript/md-docs/Others/Kubernetes/others-kubernetes-instrumentApplication.md'; import APM_javascript_others_kubernetes_recommendedSteps_runApplication from '../Modules/APM/Javascript/md-docs/Others/Kubernetes/others-kubernetes-runApplication.md'; @@ -371,6 +451,13 @@ import APM_javascript_others_macOsARM64_recommendedSteps_setupOtelCollector from import APM_javascript_others_macOsARM64_recommendedSteps_instrumentApplication from '../Modules/APM/Javascript/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-instrumentApplication.md'; import APM_javascript_others_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Javascript/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-runApplication.md'; // ---------------------------------------------------------------------------- +// ReactJS Docker +import APM_javascript_reactjs_docker_quickStart_instrumentApplication from '../Modules/APM/Javascript/md-docs/ReactJS/Docker/QuickStart/reactjs-docker-quickStart-instrumentApplication.md'; +import APM_javascript_reactjs_docker_quickStart_runApplication from '../Modules/APM/Javascript/md-docs/ReactJS/Docker/QuickStart/reactjs-docker-quickStart-runApplication.md'; +// // ReactJS-LinuxAMD64-recommended +import APM_javascript_reactjs_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Javascript/md-docs/ReactJS/Docker/Recommended/reactjs-docker-recommended-installOtelCollector.md'; +import APM_javascript_reactjs_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Javascript/md-docs/ReactJS/Docker/Recommended/reactjs-docker-recommended-instrumentApplication.md'; +import APM_javascript_reactjs_docker_recommendedSteps_runApplication from '../Modules/APM/Javascript/md-docs/ReactJS/Docker/Recommended/reactjs-docker-recommended-runApplication.md'; // ReactJS-Kubernetes import APM_javascript_reactjs_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Javascript/md-docs/ReactJS/Kubernetes/reactjs-kubernetes-installOtelCollector.md'; import APM_javascript_reactjs_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Javascript/md-docs/ReactJS/Kubernetes/reactjs-kubernetes-instrumentApplication.md'; @@ -403,6 +490,13 @@ import APM_javascript_reactjs_macOsARM64_quickStart_runApplication from '../Modu import APM_javascript_reactjs_macOsARM64_recommendedSteps_setupOtelCollector from '../Modules/APM/Javascript/md-docs/ReactJS/MacOsARM64/Recommended/reactjs-macosarm64-recommended-installOtelCollector.md'; import APM_javascript_reactjs_macOsARM64_recommendedSteps_instrumentApplication from '../Modules/APM/Javascript/md-docs/ReactJS/MacOsARM64/Recommended/reactjs-macosarm64-recommended-instrumentApplication.md'; import APM_javascript_reactjs_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Javascript/md-docs/ReactJS/MacOsARM64/Recommended/reactjs-macosarm64-recommended-runApplication.md'; +// PHP Docker +import APM_php_docker_quickStart_instrumentApplication from '../Modules/APM/Php/md-docs/Docker/QuickStart/php-docker-quickStart-instrumentApplication.md'; +import APM_php_docker_quickStart_runApplication from '../Modules/APM/Php/md-docs/Docker/QuickStart/php-docker-quickStart-runApplication.md'; +// PHP-LinuxAMD64-recommended +import APM_php_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-installOtelCollector.md'; +import APM_php_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-instrumentApplication.md'; +import APM_php_docker_recommendedSteps_runApplication from '../Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-runApplication.md'; // PHP-Kubernetes import APM_php_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Php/md-docs/Kubernetes/php-kubernetes-installOtelCollector.md'; import APM_php_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Php/md-docs/Kubernetes/php-kubernetes-instrumentApplication.md'; @@ -435,6 +529,13 @@ import APM_php_macOsARM64_quickStart_runApplication from '../Modules/APM/Php/md- import APM_php_macOsARM64_recommendedSteps_setupOtelCollector from '../Modules/APM/Php/md-docs/MacOsARM64/Recommended/php-macosarm64-recommended-installOtelCollector.md'; import APM_php_macOsARM64_recommendedSteps_instrumentApplication from '../Modules/APM/Php/md-docs/MacOsARM64/Recommended/php-macosarm64-recommended-instrumentApplication.md'; import APM_php_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Php/md-docs/MacOsARM64/Recommended/php-macosarm64-recommended-runApplication.md'; +/// ////// Docker instructions +import APM_python_django_docker_quickStart_instrumentApplication from '../Modules/APM/Python/md-docs/Django/Docker/QuickStart/django-docker-quickStart-instrumentApplication.md'; +import APM_python_django_docker_quickStart_runApplication from '../Modules/APM/Python/md-docs/Django/Docker/QuickStart/django-docker-quickStart-runApplication.md'; +// Django-LinuxAMD64-recommended +import APM_python_django_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Python/md-docs/Django/Docker/Recommended/django-docker-recommended-installOtelCollector.md'; +import APM_python_django_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Python/md-docs/Django/Docker/Recommended/django-docker-recommended-instrumentApplication.md'; +import APM_python_django_docker_recommendedSteps_runApplication from '../Modules/APM/Python/md-docs/Django/Docker/Recommended/django-docker-recommended-runApplication.md'; /// ////// Javascript Done /// ///// Python Start // Django @@ -472,6 +573,13 @@ import APM_python_django_macOsARM64_recommendedSteps_instrumentApplication from import APM_python_django_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Python/md-docs/Django/MacOsARM64/Recommended/django-macosarm64-recommended-runApplication.md'; // ---------------------------------------------------------------------------- // Falcon +// Falcon Docker +import APM_python_falcon_docker_quickStart_instrumentApplication from '../Modules/APM/Python/md-docs/Falcon/Docker/QuickStart/falcon-docker-quickStart-instrumentApplication.md'; +import APM_python_falcon_docker_quickStart_runApplication from '../Modules/APM/Python/md-docs/Falcon/Docker/QuickStart/falcon-docker-quickStart-runApplication.md'; +// Falcon-LinuxAMD64-recommended +import APM_python_falcon_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Python/md-docs/Falcon/Docker/Recommended/falcon-docker-recommended-installOtelCollector.md'; +import APM_python_falcon_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Python/md-docs/Falcon/Docker/Recommended/falcon-docker-recommended-instrumentApplication.md'; +import APM_python_falcon_docker_recommendedSteps_runApplication from '../Modules/APM/Python/md-docs/Falcon/Docker/Recommended/falcon-docker-recommended-runApplication.md'; // Falcon-Kubernetes import APM_python_falcon_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Python/md-docs/Falcon/Kubernetes/falcon-kubernetes-installOtelCollector.md'; import APM_python_falcon_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Python/md-docs/Falcon/Kubernetes/falcon-kubernetes-instrumentApplication.md'; @@ -506,6 +614,13 @@ import APM_python_falcon_macOsARM64_recommendedSteps_instrumentApplication from import APM_python_falcon_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Python/md-docs/Falcon/MacOsARM64/Recommended/falcon-macosarm64-recommended-runApplication.md'; // ---------------------------------------------------------------------------- // FastAPI +// FastAPI Docker +import APM_python_fastAPI_docker_quickStart_instrumentApplication from '../Modules/APM/Python/md-docs/FastAPI/Docker/QuickStart/fastapi-docker-quickStart-instrumentApplication.md'; +import APM_python_fastAPI_docker_quickStart_runApplication from '../Modules/APM/Python/md-docs/FastAPI/Docker/QuickStart/fastapi-docker-quickStart-runApplication.md'; +// FastAPI-LinuxAMD64-recommended +import APM_python_fastAPI_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Python/md-docs/FastAPI/Docker/Recommended/fastapi-docker-recommended-installOtelCollector.md'; +import APM_python_fastAPI_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Python/md-docs/FastAPI/Docker/Recommended/fastapi-docker-recommended-instrumentApplication.md'; +import APM_python_fastAPI_docker_recommendedSteps_runApplication from '../Modules/APM/Python/md-docs/FastAPI/Docker/Recommended/fastapi-docker-recommended-runApplication.md'; // FastAPI-Kubernetes import APM_python_fastAPI_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Python/md-docs/FastAPI/Kubernetes/fastapi-kubernetes-installOtelCollector.md'; import APM_python_fastAPI_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Python/md-docs/FastAPI/Kubernetes/fastapi-kubernetes-instrumentApplication.md'; @@ -540,6 +655,12 @@ import APM_python_fastAPI_macOsARM64_recommendedSteps_instrumentApplication from import APM_python_fastAPI_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Python/md-docs/FastAPI/MacOsARM64/Recommended/fastapi-macosarm64-recommended-runApplication.md'; // ---------------------------------------------------------------------------- // Flask +// Flask Docker +import APM_python_flask_docker_quickStart_instrumentApplication from '../Modules/APM/Python/md-docs/Flask/Docker/QuickStart/flask-docker-quickStart-instrumentApplication.md'; +import APM_python_flask_docker_quickStart_runApplication from '../Modules/APM/Python/md-docs/Flask/Docker/QuickStart/flask-docker-quickStart-runApplication.md'; +import APM_python_flask_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Python/md-docs/Flask/Docker/Recommended/flask-docker-recommended-installOtelCollector.md'; +import APM_python_flask_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Python/md-docs/Flask/Docker/Recommended/flask-docker-recommended-instrumentApplication.md'; +import APM_python_flask_docker_recommendedSteps_runApplication from '../Modules/APM/Python/md-docs/Flask/Docker/Recommended/flask-docker-recommended-runApplication.md'; // Flask-Kubernetes import APM_python_flask_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Python/md-docs/Flask/Kubernetes/flask-kubernetes-installOtelCollector.md'; import APM_python_flask_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Python/md-docs/Flask/Kubernetes/flask-kubernetes-instrumentApplication.md'; @@ -574,6 +695,13 @@ import APM_python_flask_macOsARM64_recommendedSteps_instrumentApplication from ' import APM_python_flask_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Python/md-docs/Flask/MacOsARM64/Recommended/flask-macosarm64-recommended-runApplication.md'; // ---------------------------------------------------------------------------- // Others +// Others Docker +import APM_python_other_docker_quickStart_instrumentApplication from '../Modules/APM/Python/md-docs/Others/Docker/QuickStart/others-docker-quickStart-instrumentApplication.md'; +import APM_python_other_docker_quickStart_runApplication from '../Modules/APM/Python/md-docs/Others/Docker/QuickStart/others-docker-quickStart-runApplication.md'; +// Others-LinuxAMD64-recommended +import APM_python_other_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Python/md-docs/Others/Docker/Recommended/others-docker-recommended-installOtelCollector.md'; +import APM_python_other_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Python/md-docs/Others/Docker/Recommended/others-docker-recommended-instrumentApplication.md'; +import APM_python_other_docker_recommendedSteps_runApplication from '../Modules/APM/Python/md-docs/Others/Docker/Recommended/others-docker-recommended-runApplication.md'; // Others-Kubernetes import APM_python_other_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Python/md-docs/Others/Kubernetes/others-kubernetes-installOtelCollector.md'; import APM_python_other_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Python/md-docs/Others/Kubernetes/others-kubernetes-instrumentApplication.md'; @@ -608,6 +736,13 @@ import APM_python_other_macOsARM64_recommendedSteps_instrumentApplication from ' import APM_python_other_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Python/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-runApplication.md'; // ---------------------------------------------------------------------------- /// ///// ROR Start +// ROR Docker +import APM_rails_docker_quickStart_instrumentApplication from '../Modules/APM/RubyOnRails/md-docs/Docker/QuickStart/ror-docker-quickStart-instrumentApplication.md'; +import APM_rails_docker_quickStart_runApplication from '../Modules/APM/RubyOnRails/md-docs/Docker/QuickStart/ror-docker-quickStart-runApplication.md'; +// ROR-LinuxAMD64-recommended +import APM_rails_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-installOtelCollector.md'; +import APM_rails_docker_recommendedSteps_instrumentApplication from '../Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-instrumentApplication.md'; +import APM_rails_docker_recommendedSteps_runApplication from '../Modules/APM/RubyOnRails/md-docs/Docker/Recommended/ror-docker-recommended-runApplication.md'; // ROR-Kubernetes import APM_rails_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/RubyOnRails/md-docs/Kubernetes/ror-kubernetes-installOtelCollector.md'; import APM_rails_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/RubyOnRails/md-docs/Kubernetes/ror-kubernetes-instrumentApplication.md'; @@ -640,6 +775,13 @@ import APM_rails_macOsARM64_quickStart_runApplication from '../Modules/APM/RubyO import APM_rails_macOsARM64_recommendedSteps_setupOtelCollector from '../Modules/APM/RubyOnRails/md-docs/MacOsARM64/Recommended/ror-macosarm64-recommended-installOtelCollector.md'; import APM_rails_macOsARM64_recommendedSteps_instrumentApplication from '../Modules/APM/RubyOnRails/md-docs/MacOsARM64/Recommended/ror-macosarm64-recommended-instrumentApplication.md'; import APM_rails_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/RubyOnRails/md-docs/MacOsARM64/Recommended/ror-macosarm64-recommended-runApplication.md'; +// Rust DOcker +import APM_rust_docker_quickStart_instrumentApplication from '../Modules/APM/Rust/md-docs/Docker/QuickStart/rust-docker-quickStart-instrumentApplication.md'; +import APM_rust_docker_quickStart_runApplication from '../Modules/APM/Rust/md-docs/Docker/QuickStart/rust-docker-quickStart-runApplication.md'; +// Rust-LinuxAMD64-recommended +import APM_rust_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-installOtelCollector.md'; +import APM_rust_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-instrumentApplication.md'; +import APM_rust_docker_recommendedSteps_runApplication from '../Modules/APM/Rust/md-docs/Docker/Recommended/rust-docker-recommended-runApplication.md'; // Rust-Kubernetes import APM_rust_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Rust/md-docs/Kubernetes/rust-kubernetes-installOtelCollector.md'; import APM_rust_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Rust/md-docs/Kubernetes/rust-kubernetes-instrumentApplication.md'; @@ -672,6 +814,13 @@ import APM_rust_macOsARM64_quickStart_runApplication from '../Modules/APM/Rust/m import APM_rust_macOsARM64_recommendedSteps_setupOtelCollector from '../Modules/APM/Rust/md-docs/MacOsARM64/Recommended/rust-macosarm64-recommended-installOtelCollector.md'; import APM_rust_macOsARM64_recommendedSteps_instrumentApplication from '../Modules/APM/Rust/md-docs/MacOsARM64/Recommended/rust-macosarm64-recommended-instrumentApplication.md'; import APM_rust_macOsARM64_recommendedSteps_runApplication from '../Modules/APM/Rust/md-docs/MacOsARM64/Recommended/rust-macosarm64-recommended-runApplication.md'; +// Swift Docker +import APM_swift_docker_quickStart_instrumentApplication from '../Modules/APM/Swift/md-docs/Docker/QuickStart/swift-docker-quickStart-instrumentApplication.md'; +import APM_swift_docker_quickStart_runApplication from '../Modules/APM/Swift/md-docs/Docker/QuickStart/swift-docker-quickStart-runApplication.md'; +// Swift-LinuxAMD64-recommended +import APM_swift_docker_recommendedSteps_setupOtelCollector from '../Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-installOtelCollector.md'; +import APM_swift_docker_recommendedSteps_instrumentApplication from '../Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-instrumentApplication.md'; +import APM_swift_docker_recommendedSteps_runApplication from '../Modules/APM/Swift/md-docs/Docker/Recommended/swift-docker-recommended-runApplication.md'; // Swift-Kubernetes import APM_swift_kubernetes_recommendedSteps_setupOtelCollector from '../Modules/APM/Swift/md-docs/Kubernetes/swift-kubernetes-installOtelCollector.md'; import APM_swift_kubernetes_recommendedSteps_instrumentApplication from '../Modules/APM/Swift/md-docs/Kubernetes/swift-kubernetes-instrumentApplication.md'; @@ -1609,4 +1758,153 @@ export const ApmDocFilePaths = { APM_php_macOsARM64_recommendedSteps_setupOtelCollector, APM_php_macOsARM64_recommendedSteps_instrumentApplication, APM_php_macOsARM64_recommendedSteps_runApplication, + + /// ///// Docker Steps + + APM_python_django_docker_quickStart_instrumentApplication, + APM_python_django_docker_quickStart_runApplication, + + APM_python_django_docker_recommendedSteps_setupOtelCollector, + APM_python_django_docker_recommendedSteps_instrumentApplication, + APM_python_django_docker_recommendedSteps_runApplication, + + APM_python_flask_docker_quickStart_instrumentApplication, + APM_python_flask_docker_quickStart_runApplication, + + APM_python_flask_docker_recommendedSteps_setupOtelCollector, + APM_python_flask_docker_recommendedSteps_instrumentApplication, + APM_python_flask_docker_recommendedSteps_runApplication, + + APM_python_fastAPI_docker_quickStart_instrumentApplication, + APM_python_fastAPI_docker_quickStart_runApplication, + + APM_python_fastAPI_docker_recommendedSteps_setupOtelCollector, + APM_python_fastAPI_docker_recommendedSteps_instrumentApplication, + APM_python_fastAPI_docker_recommendedSteps_runApplication, + + APM_python_falcon_docker_quickStart_instrumentApplication, + APM_python_falcon_docker_quickStart_runApplication, + + APM_python_falcon_docker_recommendedSteps_setupOtelCollector, + APM_python_falcon_docker_recommendedSteps_instrumentApplication, + APM_python_falcon_docker_recommendedSteps_runApplication, + + APM_python_other_docker_quickStart_instrumentApplication, + APM_python_other_docker_quickStart_runApplication, + + APM_python_other_docker_recommendedSteps_setupOtelCollector, + APM_python_other_docker_recommendedSteps_instrumentApplication, + APM_python_other_docker_recommendedSteps_runApplication, + + APM_javascript_nodejs_docker_quickStart_instrumentApplication, + APM_javascript_nodejs_docker_quickStart_runApplication, + + APM_javascript_nodejs_docker_recommendedSteps_setupOtelCollector, + APM_javascript_nodejs_docker_recommendedSteps_instrumentApplication, + APM_javascript_nodejs_docker_recommendedSteps_runApplication, + + APM_javascript_nestjs_docker_quickStart_instrumentApplication, + APM_javascript_nestjs_docker_quickStart_runApplication, + + APM_javascript_nestjs_docker_recommendedSteps_instrumentApplication, + APM_javascript_nestjs_docker_recommendedSteps_setupOtelCollector, + APM_javascript_nestjs_docker_recommendedSteps_runApplication, + + APM_javascript_express_docker_quickStart_instrumentApplication, + APM_javascript_express_docker_quickStart_runApplication, + + APM_javascript_express_docker_recommendedSteps_setupOtelCollector, + APM_javascript_express_docker_recommendedSteps_instrumentApplication, + APM_javascript_express_docker_recommendedSteps_runApplication, + + APM_javascript_reactjs_docker_quickStart_instrumentApplication, + APM_javascript_reactjs_docker_quickStart_runApplication, + + APM_javascript_reactjs_docker_recommendedSteps_setupOtelCollector, + APM_javascript_reactjs_docker_recommendedSteps_instrumentApplication, + APM_javascript_reactjs_docker_recommendedSteps_runApplication, + + APM_javascript_others_docker_quickStart_instrumentApplication, + APM_javascript_others_docker_quickStart_runApplication, + + APM_javascript_others_docker_recommendedSteps_setupOtelCollector, + APM_javascript_others_docker_recommendedSteps_instrumentApplication, + APM_javascript_others_docker_recommendedSteps_runApplication, + + APM_java_jboss_docker_quickStart_instrumentApplication, + APM_java_jboss_docker_quickStart_runApplication, + + APM_java_jboss_docker_recommendedSteps_setupOtelCollector, + APM_java_jboss_docker_recommendedSteps_instrumentApplication, + APM_java_jboss_docker_recommendedSteps_runApplication, + + APM_java_springBoot_docker_quickStart_instrumentApplication, + APM_java_springBoot_docker_quickStart_runApplication, + + APM_java_springBoot_docker_recommendedSteps_setupOtelCollector, + APM_java_springBoot_docker_recommendedSteps_instrumentApplication, + APM_java_springBoot_docker_recommendedSteps_runApplication, + + APM_java_tomcat_docker_quickStart_instrumentApplication, + APM_java_tomcat_docker_quickStart_runApplication, + + APM_java_tomcat_docker_recommendedSteps_setupOtelCollector, + APM_java_tomcat_docker_recommendedSteps_instrumentApplication, + APM_java_tomcat_docker_recommendedSteps_runApplication, + + APM_java_other_docker_quickStart_instrumentApplication, + APM_java_other_docker_quickStart_runApplication, + + APM_java_other_docker_recommendedSteps_setupOtelCollector, + APM_java_other_docker_recommendedSteps_instrumentApplication, + APM_java_other_docker_recommendedSteps_runApplication, + + APM_go_docker_quickStart_instrumentApplication, + APM_go_docker_quickStart_runApplication, + + APM_go_docker_recommendedSteps_setupOtelCollector, + APM_go_docker_recommendedSteps_instrumentApplication, + APM_go_docker_recommendedSteps_runApplication, + + APM_rust_docker_quickStart_instrumentApplication, + APM_rust_docker_quickStart_runApplication, + + APM_rust_docker_recommendedSteps_setupOtelCollector, + APM_rust_docker_recommendedSteps_instrumentApplication, + APM_rust_docker_recommendedSteps_runApplication, + + APM_elixir_docker_quickStart_instrumentApplication, + APM_elixir_docker_quickStart_runApplication, + + APM_elixir_docker_recommendedSteps_setupOtelCollector, + APM_elixir_docker_recommendedSteps_instrumentApplication, + APM_elixir_docker_recommendedSteps_runApplication, + + APM_dotnet_docker_quickStart_instrumentApplication, + APM_dotnet_docker_quickStart_runApplication, + + APM_dotnet_docker_recommendedSteps_setupOtelCollector, + APM_dotnet_docker_recommendedSteps_instrumentApplication, + APM_dotnet_docker_recommendedSteps_runApplication, + + APM_rails_docker_quickStart_instrumentApplication, + APM_rails_docker_quickStart_runApplication, + + APM_rails_docker_recommendedSteps_setupOtelCollector, + APM_rails_docker_recommendedSteps_instrumentApplication, + APM_rails_docker_recommendedSteps_runApplication, + + APM_swift_docker_quickStart_instrumentApplication, + APM_swift_docker_quickStart_runApplication, + + APM_swift_docker_recommendedSteps_setupOtelCollector, + APM_swift_docker_recommendedSteps_instrumentApplication, + APM_swift_docker_recommendedSteps_runApplication, + + APM_php_docker_quickStart_instrumentApplication, + APM_php_docker_quickStart_runApplication, + + APM_php_docker_recommendedSteps_setupOtelCollector, + APM_php_docker_recommendedSteps_instrumentApplication, + APM_php_docker_recommendedSteps_runApplication, }; From 0c7e63d7357f76c7e555282e9cc04bec2cded0f8 Mon Sep 17 00:00:00 2001 From: CheetoDa Date: Wed, 3 Apr 2024 04:08:46 +0530 Subject: [PATCH 29/68] chore: saved unsaved files --- ...docker-quickStart-instrumentApplication.md | 2 +- ...docker-recommended-installOtelCollector.md | 94 +------------------ ...ocker-recommended-instrumentApplication.md | 4 +- 3 files changed, 9 insertions(+), 91 deletions(-) diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Docker/QuickStart/dotnet-docker-quickStart-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Docker/QuickStart/dotnet-docker-quickStart-instrumentApplication.md index 1619f2f22911..b1df18e5125a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Docker/QuickStart/dotnet-docker-quickStart-instrumentApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/Docker/QuickStart/dotnet-docker-quickStart-instrumentApplication.md @@ -73,7 +73,7 @@ This is done by configuring an OpenTelemetry [TracerProvider](https://github.com ### Step 3: Dockerize your application -Since the crucial environment variables like SIGNOZ_INGESTION_KEY, Ingestion Endpoint and Service name are set in the `program.cs` file, you don't need to add any additional steps in your Dockerfile. +Since the environment variables like SIGNOZ_INGESTION_KEY, Ingestion Endpoint and Service name are set in the `program.cs` file, you don't need to add any additional steps in your Dockerfile. An **example** of a Dockerfile could look like this: diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-installOtelCollector.md index a659f3647456..fbeda9c337a1 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-installOtelCollector.md @@ -1,96 +1,12 @@ ## Setup OpenTelemetry Binary as an agent +   -### Step 1: Download otel-collector tar.gz -```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz -``` +As a first step, you should install the OTel collector Binary according to the instructions provided on [this link](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/). +   -### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder -```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib -``` +Once you are done setting up the OTel collector binary, you can follow the next steps. +   -### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it -```bash -receivers: - otlp: - protocols: - grpc: - endpoint: 0.0.0.0:4317 - http: - endpoint: 0.0.0.0:4318 - hostmetrics: - collection_interval: 60s - scrapers: - cpu: {} - disk: {} - load: {} - filesystem: {} - memory: {} - network: {} - paging: {} - process: - mute_process_name_error: true - mute_process_exe_error: true - mute_process_io_error: true - processes: {} - prometheus: - config: - global: - scrape_interval: 60s - scrape_configs: - - job_name: otel-collector-binary - static_configs: - - targets: - # - localhost:8888 -processors: - batch: - send_batch_size: 1000 - timeout: 10s - # Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md - resourcedetection: - detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure. - # Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels. - timeout: 2s - system: - hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback -extensions: - health_check: {} - zpages: {} -exporters: - otlp: - endpoint: "ingest.{{REGION}}.signoz.cloud:443" - tls: - insecure: false - headers: - "signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}" - logging: - verbosity: normal -service: - telemetry: - metrics: - address: 0.0.0.0:8888 - extensions: [health_check, zpages] - pipelines: - metrics: - receivers: [otlp] - processors: [batch] - exporters: [otlp] - metrics/internal: - receivers: [prometheus, hostmetrics] - processors: [resourcedetection, batch] - exporters: [otlp] - traces: - receivers: [otlp] - processors: [batch] - exporters: [otlp] - logs: - receivers: [otlp] - processors: [batch] - exporters: [otlp] -``` - - diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-instrumentApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-instrumentApplication.md index e05b167123f2..cb7b7c81f7d0 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-instrumentApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/Docker/Recommended/php-docker-recommended-instrumentApplication.md @@ -79,4 +79,6 @@ ENV OTEL_PHP_AUTOLOAD_ENABLED=true \ OTEL_EXPORTER_OTLP_ENDPOINT= \ OTEL_PROPAGATORS=baggage,tracecontext ... -``` \ No newline at end of file +``` + +- - Endpoint at which the collector is running. Ex. -> `http://localhost:4317` \ No newline at end of file From 1a14cc305c21b93f42167c59236f7296f1eb671b Mon Sep 17 00:00:00 2001 From: CheetoDa Date: Wed, 3 Apr 2024 04:28:15 +0530 Subject: [PATCH 30/68] feat: updated otel version number --- .../dotnet-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../dotnet-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../dotnet-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../dotnet-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../elixir-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../elixir-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../elixir-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../elixir-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../golang-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../golang-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../golang-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../golang-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../jboss-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../jboss-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../jboss-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../jboss-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../others-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../others-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../others-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../others-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../springBoot-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../springBoot-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../springBoot-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../springBoot-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../tomcat-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../tomcat-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../tomcat-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../tomcat-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../express-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../express-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../express-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../express-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../nestjs-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../nestjs-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../nestjs-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../nestjs-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../nodejs-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../nodejs-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../nodejs-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../others-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../others-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../others-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../others-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../reactjs-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../reactjs-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../reactjs-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../reactjs-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../php-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../php-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../php-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../php-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../django-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../django-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../django-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../django-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../falcon-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../falcon-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../falcon-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../falcon-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../fastapi-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../fastapi-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../fastapi-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../fastapi-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../flask-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../flask-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../flask-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../flask-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../others-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../others-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../others-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../others-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../ror-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../ror-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../ror-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../ror-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../rust-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../rust-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../rust-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../rust-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../swift-linuxamd64-recommended-installOtelCollector.md | 4 ++-- .../swift-linuxarm64-recommended-installOtelCollector.md | 4 ++-- .../swift-macosamd64-recommended-installOtelCollector.md | 4 ++-- .../swift-macosarm64-recommended-installOtelCollector.md | 4 ++-- .../appplicationLogs-linuxamd64-installOtelCollector.md | 4 ++-- .../appplicationLogs-linuxarm64-installOtelCollector.md | 4 ++-- .../appplicationLogs-macosamd64-installOtelCollector.md | 4 ++-- .../appplicationLogs-macosarm64-installOtelCollector.md | 4 ++-- .../md-docs/LinuxAMD64/hostmetrics-setupOtelCollector.md | 4 ++-- .../md-docs/LinuxARM64/hostmetrics-setupOtelCollector.md | 4 ++-- .../md-docs/MacOsAMD64/hostmetrics-setupOtelCollector.md | 4 ++-- .../md-docs/MacOsARM64/hostmetrics-setupOtelCollector.md | 4 ++-- .../md-docs/LinuxAMD64/hostmetrics-setupOtelCollector.md | 4 ++-- .../md-docs/LinuxARM64/hostmetrics-setupOtelCollector.md | 4 ++-- .../md-docs/MacOsAMD64/hostmetrics-setupOtelCollector.md | 4 ++-- .../md-docs/MacOsARM64/hostmetrics-setupOtelCollector.md | 4 ++-- .../md-docs/LinuxAMD64/otherMetrics-setupOtelCollector.md | 4 ++-- .../md-docs/LinuxARM64/otherMetrics-setupOtelCollector.md | 4 ++-- .../md-docs/MacOsAMD64/otherMetrics-setupOtelCollector.md | 4 ++-- .../md-docs/MacOsARM64/otherMetrics-setupOtelCollector.md | 4 ++-- .../appplicationLogs-linuxamd64-installOtelCollector.md | 4 ++-- .../appplicationLogs-linuxarm64-installOtelCollector.md | 4 ++-- .../appplicationLogs-macosamd64-installOtelCollector.md | 4 ++-- .../appplicationLogs-macosarm64-installOtelCollector.md | 4 ++-- .../LinuxAMD64/cloudwatch-linuxamd64-installOtelCollector.md | 4 ++-- .../LinuxARM64/cloudwatch-linuxarm64-installOtelCollector.md | 4 ++-- .../MacOsAMD64/cloudwatch-macosamd64-installOtelCollector.md | 4 ++-- .../MacOsARM64/cloudwatch-macosarm64-installOtelCollector.md | 4 ++-- .../LinuxAMD64/fluentbit-linuxamd64-installOtelCollector.md | 4 ++-- .../LinuxARM64/fluentbit-linuxarm64-installOtelCollector.md | 4 ++-- .../MacOsAMD64/fluentbit-macosamd64-installOtelCollector.md | 4 ++-- .../MacOsARM64/fluentbit-macosarm64-installOtelCollector.md | 4 ++-- .../LinuxAMD64/fluentd-linuxamd64-installOtelCollector.md | 4 ++-- .../LinuxARM64/fluentd-linuxarm64-installOtelCollector.md | 4 ++-- .../MacOsAMD64/fluentd-macosamd64-installOtelCollector.md | 4 ++-- .../MacOsARM64/fluentd-macosarm64-installOtelCollector.md | 4 ++-- .../LinuxAMD64/logstash-linuxamd64-installOtelCollector.md | 4 ++-- .../LinuxARM64/logstash-linuxarm64-installOtelCollector.md | 4 ++-- .../MacOsAMD64/logstash-macosamd64-installOtelCollector.md | 4 ++-- .../MacOsARM64/logstash-macosarm64-installOtelCollector.md | 4 ++-- .../LinuxAMD64/syslogs-linuxamd64-installOtelCollector.md | 4 ++-- .../LinuxARM64/syslogs-linuxarm64-installOtelCollector.md | 4 ++-- .../MacOsAMD64/syslogs-macosamd64-installOtelCollector.md | 4 ++-- .../MacOsARM64/syslogs-macosarm64-installOtelCollector.md | 4 ++-- .../OnboardingContainer/Steps/MarkdownStep/MarkdownStep.tsx | 1 + frontend/src/utils/app.ts | 1 + 125 files changed, 248 insertions(+), 246 deletions(-) diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-installOtelCollector.md index 09602cc00325..d31875d772b1 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxAMD64/Recommended/dotnet-linuxamd64-recommended-installOtelCollector.md @@ -3,14 +3,14 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-installOtelCollector.md index a56cc30fccb9..2cf92329b46b 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/LinuxARM64/Recommended/dotnet-linuxarm64-recommended-installOtelCollector.md @@ -4,14 +4,14 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-installOtelCollector.md index ef44c0fa8027..ae55268759d1 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsAMD64/Recommended/dotnet-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-installOtelCollector.md index 66260a66e15a..85c93359646c 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Dotnet/md-docs/MacOsARM64/Recommended/dotnet-macosarm64-recommended-installOtelCollector.md @@ -3,14 +3,14 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/LinuxAMD64/Recommended/elixir-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/LinuxAMD64/Recommended/elixir-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/LinuxAMD64/Recommended/elixir-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/LinuxAMD64/Recommended/elixir-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/LinuxARM64/Recommended/elixir-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/LinuxARM64/Recommended/elixir-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/LinuxARM64/Recommended/elixir-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/LinuxARM64/Recommended/elixir-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/MacOsAMD64/Recommended/elixir-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/MacOsAMD64/Recommended/elixir-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/MacOsAMD64/Recommended/elixir-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/MacOsAMD64/Recommended/elixir-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/MacOsARM64/Recommended/elixir-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/MacOsARM64/Recommended/elixir-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/MacOsARM64/Recommended/elixir-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Elixir/md-docs/MacOsARM64/Recommended/elixir-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxAMD64/Recommended/golang-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxAMD64/Recommended/golang-linuxamd64-recommended-installOtelCollector.md index 3fa9a2aa5b8d..703dcb05506f 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxAMD64/Recommended/golang-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxAMD64/Recommended/golang-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxARM64/Recommended/golang-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxARM64/Recommended/golang-linuxarm64-recommended-installOtelCollector.md index 36553fba5ae3..d26225d266ee 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxARM64/Recommended/golang-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/LinuxARM64/Recommended/golang-linuxarm64-recommended-installOtelCollector.md @@ -5,13 +5,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```     diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsAMD64/Recommended/golang-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsAMD64/Recommended/golang-macosamd64-recommended-installOtelCollector.md index 2bd05c79fa43..7cbefc6912f4 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsAMD64/Recommended/golang-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsAMD64/Recommended/golang-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsARM64/Recommended/golang-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsARM64/Recommended/golang-macosarm64-recommended-installOtelCollector.md index c326cedbee3f..5e772744c9e5 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsARM64/Recommended/golang-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/GoLang/md-docs/MacOsARM64/Recommended/golang-macosarm64-recommended-installOtelCollector.md @@ -3,11 +3,11 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/LinuxAMD64/Recommended/jboss-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/LinuxAMD64/Recommended/jboss-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/LinuxAMD64/Recommended/jboss-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/LinuxAMD64/Recommended/jboss-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/LinuxARM64/Recommended/jboss-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/LinuxARM64/Recommended/jboss-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/LinuxARM64/Recommended/jboss-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/LinuxARM64/Recommended/jboss-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/MacOsAMD64/Recommended/jboss-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/MacOsAMD64/Recommended/jboss-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/MacOsAMD64/Recommended/jboss-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/MacOsAMD64/Recommended/jboss-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/MacOsARM64/Recommended/jboss-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/MacOsARM64/Recommended/jboss-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/MacOsARM64/Recommended/jboss-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Jboss/MacOsARM64/Recommended/jboss-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxAMD64/Recommended/springBoot-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxAMD64/Recommended/springBoot-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxAMD64/Recommended/springBoot-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxAMD64/Recommended/springBoot-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxARM64/Recommended/springBoot-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxARM64/Recommended/springBoot-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxARM64/Recommended/springBoot-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxARM64/Recommended/springBoot-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsAMD64/Recommended/springBoot-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsAMD64/Recommended/springBoot-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsAMD64/Recommended/springBoot-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsAMD64/Recommended/springBoot-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsARM64/Recommended/springBoot-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsARM64/Recommended/springBoot-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsARM64/Recommended/springBoot-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsARM64/Recommended/springBoot-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/LinuxAMD64/Recommended/tomcat-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/LinuxAMD64/Recommended/tomcat-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/LinuxAMD64/Recommended/tomcat-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/LinuxAMD64/Recommended/tomcat-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/LinuxARM64/Recommended/tomcat-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/LinuxARM64/Recommended/tomcat-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/LinuxARM64/Recommended/tomcat-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/LinuxARM64/Recommended/tomcat-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/MacOsAMD64/Recommended/tomcat-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/MacOsAMD64/Recommended/tomcat-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/MacOsAMD64/Recommended/tomcat-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/MacOsAMD64/Recommended/tomcat-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/MacOsARM64/Recommended/tomcat-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/MacOsARM64/Recommended/tomcat-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/MacOsARM64/Recommended/tomcat-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Tomcat/MacOsARM64/Recommended/tomcat-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/LinuxAMD64/Recommended/express-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/LinuxAMD64/Recommended/express-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/LinuxAMD64/Recommended/express-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/LinuxAMD64/Recommended/express-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/LinuxARM64/Recommended/express-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/LinuxARM64/Recommended/express-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/LinuxARM64/Recommended/express-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/LinuxARM64/Recommended/express-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/MacOsAMD64/Recommended/express-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/MacOsAMD64/Recommended/express-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/MacOsAMD64/Recommended/express-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/MacOsAMD64/Recommended/express-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/MacOsARM64/Recommended/express-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/MacOsARM64/Recommended/express-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/MacOsARM64/Recommended/express-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Express/MacOsARM64/Recommended/express-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/LinuxAMD64/Recommended/nestjs-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/LinuxAMD64/Recommended/nestjs-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/LinuxAMD64/Recommended/nestjs-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/LinuxAMD64/Recommended/nestjs-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/LinuxARM64/Recommended/nestjs-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/LinuxARM64/Recommended/nestjs-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/LinuxARM64/Recommended/nestjs-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/LinuxARM64/Recommended/nestjs-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/MacOsAMD64/Recommended/nestjs-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/MacOsAMD64/Recommended/nestjs-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/MacOsAMD64/Recommended/nestjs-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/MacOsAMD64/Recommended/nestjs-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/MacOsARM64/Recommended/nestjs-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/MacOsARM64/Recommended/nestjs-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/MacOsARM64/Recommended/nestjs-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NestJS/MacOsARM64/Recommended/nestjs-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/LinuxAMD64/Recommended/nodejs-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/LinuxAMD64/Recommended/nodejs-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/LinuxAMD64/Recommended/nodejs-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/LinuxAMD64/Recommended/nodejs-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/LinuxARM64/Recommended/nodejs-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/LinuxARM64/Recommended/nodejs-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/LinuxARM64/Recommended/nodejs-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/LinuxARM64/Recommended/nodejs-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/MacOsARM64/Recommended/nodejs-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/MacOsARM64/Recommended/nodejs-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/MacOsARM64/Recommended/nodejs-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/NodeJS/MacOsARM64/Recommended/nodejs-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/LinuxAMD64/Recommended/reactjs-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/LinuxAMD64/Recommended/reactjs-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/LinuxAMD64/Recommended/reactjs-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/LinuxAMD64/Recommended/reactjs-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/LinuxARM64/Recommended/reactjs-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/LinuxARM64/Recommended/reactjs-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/LinuxARM64/Recommended/reactjs-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/LinuxARM64/Recommended/reactjs-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/MacOsAMD64/Recommended/reactjs-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/MacOsAMD64/Recommended/reactjs-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/MacOsAMD64/Recommended/reactjs-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/MacOsAMD64/Recommended/reactjs-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/MacOsARM64/Recommended/reactjs-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/MacOsARM64/Recommended/reactjs-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/MacOsARM64/Recommended/reactjs-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Javascript/md-docs/ReactJS/MacOsARM64/Recommended/reactjs-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/LinuxAMD64/Recommended/php-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/LinuxAMD64/Recommended/php-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/LinuxAMD64/Recommended/php-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/LinuxAMD64/Recommended/php-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/LinuxARM64/Recommended/php-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/LinuxARM64/Recommended/php-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/LinuxARM64/Recommended/php-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/LinuxARM64/Recommended/php-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/MacOsAMD64/Recommended/php-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/MacOsAMD64/Recommended/php-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/MacOsAMD64/Recommended/php-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/MacOsAMD64/Recommended/php-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/MacOsARM64/Recommended/php-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/MacOsARM64/Recommended/php-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/MacOsARM64/Recommended/php-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Php/md-docs/MacOsARM64/Recommended/php-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/LinuxAMD64/Recommended/django-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/LinuxAMD64/Recommended/django-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/LinuxAMD64/Recommended/django-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/LinuxAMD64/Recommended/django-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/LinuxARM64/Recommended/django-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/LinuxARM64/Recommended/django-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/LinuxARM64/Recommended/django-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/LinuxARM64/Recommended/django-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/MacOsAMD64/Recommended/django-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/MacOsAMD64/Recommended/django-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/MacOsAMD64/Recommended/django-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/MacOsAMD64/Recommended/django-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/MacOsARM64/Recommended/django-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/MacOsARM64/Recommended/django-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/MacOsARM64/Recommended/django-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Django/MacOsARM64/Recommended/django-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/LinuxAMD64/Recommended/falcon-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/LinuxAMD64/Recommended/falcon-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/LinuxAMD64/Recommended/falcon-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/LinuxAMD64/Recommended/falcon-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/LinuxARM64/Recommended/falcon-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/LinuxARM64/Recommended/falcon-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/LinuxARM64/Recommended/falcon-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/LinuxARM64/Recommended/falcon-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/MacOsAMD64/Recommended/falcon-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/MacOsAMD64/Recommended/falcon-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/MacOsAMD64/Recommended/falcon-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/MacOsAMD64/Recommended/falcon-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/MacOsARM64/Recommended/falcon-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/MacOsARM64/Recommended/falcon-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/MacOsARM64/Recommended/falcon-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Falcon/MacOsARM64/Recommended/falcon-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/LinuxAMD64/Recommended/fastapi-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/LinuxAMD64/Recommended/fastapi-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/LinuxAMD64/Recommended/fastapi-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/LinuxAMD64/Recommended/fastapi-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/LinuxARM64/Recommended/fastapi-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/LinuxARM64/Recommended/fastapi-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/LinuxARM64/Recommended/fastapi-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/LinuxARM64/Recommended/fastapi-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/MacOsAMD64/Recommended/fastapi-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/MacOsAMD64/Recommended/fastapi-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/MacOsAMD64/Recommended/fastapi-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/MacOsAMD64/Recommended/fastapi-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/MacOsARM64/Recommended/fastapi-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/MacOsARM64/Recommended/fastapi-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/MacOsARM64/Recommended/fastapi-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/FastAPI/MacOsARM64/Recommended/fastapi-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/LinuxAMD64/Recommended/flask-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/LinuxAMD64/Recommended/flask-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/LinuxAMD64/Recommended/flask-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/LinuxAMD64/Recommended/flask-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/LinuxARM64/Recommended/flask-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/LinuxARM64/Recommended/flask-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/LinuxARM64/Recommended/flask-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/LinuxARM64/Recommended/flask-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/MacOsAMD64/Recommended/flask-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/MacOsAMD64/Recommended/flask-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/MacOsAMD64/Recommended/flask-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/MacOsAMD64/Recommended/flask-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/MacOsARM64/Recommended/flask-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/MacOsARM64/Recommended/flask-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/MacOsARM64/Recommended/flask-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Flask/MacOsARM64/Recommended/flask-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Python/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/LinuxAMD64/Recommended/ror-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/LinuxAMD64/Recommended/ror-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/LinuxAMD64/Recommended/ror-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/LinuxAMD64/Recommended/ror-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/LinuxARM64/Recommended/ror-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/LinuxARM64/Recommended/ror-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/LinuxARM64/Recommended/ror-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/LinuxARM64/Recommended/ror-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/MacOsAMD64/Recommended/ror-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/MacOsAMD64/Recommended/ror-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/MacOsAMD64/Recommended/ror-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/MacOsAMD64/Recommended/ror-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/MacOsARM64/Recommended/ror-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/MacOsARM64/Recommended/ror-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/MacOsARM64/Recommended/ror-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/RubyOnRails/md-docs/MacOsARM64/Recommended/ror-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/LinuxAMD64/Recommended/rust-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/LinuxAMD64/Recommended/rust-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/LinuxAMD64/Recommended/rust-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/LinuxAMD64/Recommended/rust-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/LinuxARM64/Recommended/rust-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/LinuxARM64/Recommended/rust-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/LinuxARM64/Recommended/rust-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/LinuxARM64/Recommended/rust-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/MacOsAMD64/Recommended/rust-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/MacOsAMD64/Recommended/rust-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/MacOsAMD64/Recommended/rust-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/MacOsAMD64/Recommended/rust-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/MacOsARM64/Recommended/rust-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/MacOsARM64/Recommended/rust-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/MacOsARM64/Recommended/rust-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Rust/md-docs/MacOsARM64/Recommended/rust-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/LinuxAMD64/Recommended/swift-linuxamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/LinuxAMD64/Recommended/swift-linuxamd64-recommended-installOtelCollector.md index a659f3647456..3d4f2c1377cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/LinuxAMD64/Recommended/swift-linuxamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/LinuxAMD64/Recommended/swift-linuxamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/LinuxARM64/Recommended/swift-linuxarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/LinuxARM64/Recommended/swift-linuxarm64-recommended-installOtelCollector.md index cbabb8077b41..6998ebf60c94 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/LinuxARM64/Recommended/swift-linuxarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/LinuxARM64/Recommended/swift-linuxarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/MacOsAMD64/Recommended/swift-macosamd64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/MacOsAMD64/Recommended/swift-macosamd64-recommended-installOtelCollector.md index 843e86a411ae..7870e149f733 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/MacOsAMD64/Recommended/swift-macosamd64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/MacOsAMD64/Recommended/swift-macosamd64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/MacOsARM64/Recommended/swift-macosarm64-recommended-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/MacOsARM64/Recommended/swift-macosarm64-recommended-installOtelCollector.md index 3a780bb8de0f..37a7cd00809a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/MacOsARM64/Recommended/swift-macosarm64-recommended-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Swift/md-docs/MacOsARM64/Recommended/swift-macosarm64-recommended-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/LinuxAMD64/appplicationLogs-linuxamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/LinuxAMD64/appplicationLogs-linuxamd64-installOtelCollector.md index cc45b65165c7..d4c104e5f053 100644 --- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/LinuxAMD64/appplicationLogs-linuxamd64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/LinuxAMD64/appplicationLogs-linuxamd64-installOtelCollector.md @@ -7,12 +7,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/LinuxARM64/appplicationLogs-linuxarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/LinuxARM64/appplicationLogs-linuxarm64-installOtelCollector.md index 1685719272d4..bf7b02d76406 100644 --- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/LinuxARM64/appplicationLogs-linuxarm64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/LinuxARM64/appplicationLogs-linuxarm64-installOtelCollector.md @@ -7,12 +7,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/MacOsAMD64/appplicationLogs-macosamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/MacOsAMD64/appplicationLogs-macosamd64-installOtelCollector.md index 4d59ad1b2c1d..e7f37b14da89 100644 --- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/MacOsAMD64/appplicationLogs-macosamd64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/MacOsAMD64/appplicationLogs-macosamd64-installOtelCollector.md @@ -7,12 +7,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/MacOsARM64/appplicationLogs-macosarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/MacOsARM64/appplicationLogs-macosarm64-installOtelCollector.md index b4b36cb3c6e9..60071fa7a699 100644 --- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/MacOsARM64/appplicationLogs-macosarm64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2ApplicationLogs/md-docs/MacOsARM64/appplicationLogs-macosarm64-installOtelCollector.md @@ -7,12 +7,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxAMD64/hostmetrics-setupOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxAMD64/hostmetrics-setupOtelCollector.md index eaba01bfd838..62454c4d8b1b 100644 --- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxAMD64/hostmetrics-setupOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxAMD64/hostmetrics-setupOtelCollector.md @@ -7,12 +7,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxARM64/hostmetrics-setupOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxARM64/hostmetrics-setupOtelCollector.md index 9d23e612958a..58f033b75155 100644 --- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxARM64/hostmetrics-setupOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/LinuxARM64/hostmetrics-setupOtelCollector.md @@ -7,12 +7,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsAMD64/hostmetrics-setupOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsAMD64/hostmetrics-setupOtelCollector.md index 26e95c43a7f4..b68622b6c02d 100644 --- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsAMD64/hostmetrics-setupOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsAMD64/hostmetrics-setupOtelCollector.md @@ -7,12 +7,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsARM64/hostmetrics-setupOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsARM64/hostmetrics-setupOtelCollector.md index e35173ba0882..819bc4092972 100644 --- a/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsARM64/hostmetrics-setupOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/AwsMonitoring/EC2InfrastructureMetrics/md-docs/MacOsARM64/hostmetrics-setupOtelCollector.md @@ -7,11 +7,11 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxAMD64/hostmetrics-setupOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxAMD64/hostmetrics-setupOtelCollector.md index b390df7f0d01..b759819faa14 100644 --- a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxAMD64/hostmetrics-setupOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxAMD64/hostmetrics-setupOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxARM64/hostmetrics-setupOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxARM64/hostmetrics-setupOtelCollector.md index dda1f067770b..3252f7de1e34 100644 --- a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxARM64/hostmetrics-setupOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/LinuxARM64/hostmetrics-setupOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsAMD64/hostmetrics-setupOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsAMD64/hostmetrics-setupOtelCollector.md index d85ed9c4f288..bd36ac761862 100644 --- a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsAMD64/hostmetrics-setupOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsAMD64/hostmetrics-setupOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsARM64/hostmetrics-setupOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsARM64/hostmetrics-setupOtelCollector.md index ef4ed9019360..07eb310d98db 100644 --- a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsARM64/hostmetrics-setupOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/Hostmetrics/md-docs/MacOsARM64/hostmetrics-setupOtelCollector.md @@ -2,11 +2,11 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/LinuxAMD64/otherMetrics-setupOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/LinuxAMD64/otherMetrics-setupOtelCollector.md index b390df7f0d01..b759819faa14 100644 --- a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/LinuxAMD64/otherMetrics-setupOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/LinuxAMD64/otherMetrics-setupOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/LinuxARM64/otherMetrics-setupOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/LinuxARM64/otherMetrics-setupOtelCollector.md index dda1f067770b..3252f7de1e34 100644 --- a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/LinuxARM64/otherMetrics-setupOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/LinuxARM64/otherMetrics-setupOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/MacOsAMD64/otherMetrics-setupOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/MacOsAMD64/otherMetrics-setupOtelCollector.md index d85ed9c4f288..bd36ac761862 100644 --- a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/MacOsAMD64/otherMetrics-setupOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/MacOsAMD64/otherMetrics-setupOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/MacOsARM64/otherMetrics-setupOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/MacOsARM64/otherMetrics-setupOtelCollector.md index 85a19c7c9c6c..f53a47b046f2 100644 --- a/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/MacOsARM64/otherMetrics-setupOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/InfrastructureMonitoring/OtherMetrics/md-docs/MacOsARM64/otherMetrics-setupOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/LinuxAMD64/appplicationLogs-linuxamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/LinuxAMD64/appplicationLogs-linuxamd64-installOtelCollector.md index b390df7f0d01..b759819faa14 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/LinuxAMD64/appplicationLogs-linuxamd64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/LinuxAMD64/appplicationLogs-linuxamd64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/LinuxARM64/appplicationLogs-linuxarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/LinuxARM64/appplicationLogs-linuxarm64-installOtelCollector.md index dda1f067770b..3252f7de1e34 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/LinuxARM64/appplicationLogs-linuxarm64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/LinuxARM64/appplicationLogs-linuxarm64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/MacOsAMD64/appplicationLogs-macosamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/MacOsAMD64/appplicationLogs-macosamd64-installOtelCollector.md index d85ed9c4f288..bd36ac761862 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/MacOsAMD64/appplicationLogs-macosamd64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/MacOsAMD64/appplicationLogs-macosamd64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/MacOsARM64/appplicationLogs-macosarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/MacOsARM64/appplicationLogs-macosarm64-installOtelCollector.md index 85a19c7c9c6c..f53a47b046f2 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/MacOsARM64/appplicationLogs-macosarm64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/ApplicationLogs/md-docs/MacOsARM64/appplicationLogs-macosarm64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-installOtelCollector.md index 19bccd2e6c9a..15c86c8c1b93 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxAMD64/cloudwatch-linuxamd64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-installOtelCollector.md index f82ce3ab2323..dfc47316fc11 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/LinuxARM64/cloudwatch-linuxarm64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-installOtelCollector.md index 83e8fa1cb90b..1566b1965b34 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsAMD64/cloudwatch-macosamd64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-installOtelCollector.md index 0152e03e34ac..7d93dd08efe9 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Cloudwatch/md-docs/MacOsARM64/cloudwatch-macosarm64-installOtelCollector.md @@ -2,11 +2,11 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/LinuxAMD64/fluentbit-linuxamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/LinuxAMD64/fluentbit-linuxamd64-installOtelCollector.md index b390df7f0d01..b759819faa14 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/LinuxAMD64/fluentbit-linuxamd64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/LinuxAMD64/fluentbit-linuxamd64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/LinuxARM64/fluentbit-linuxarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/LinuxARM64/fluentbit-linuxarm64-installOtelCollector.md index dda1f067770b..3252f7de1e34 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/LinuxARM64/fluentbit-linuxarm64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/LinuxARM64/fluentbit-linuxarm64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/MacOsAMD64/fluentbit-macosamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/MacOsAMD64/fluentbit-macosamd64-installOtelCollector.md index d85ed9c4f288..bd36ac761862 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/MacOsAMD64/fluentbit-macosamd64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/MacOsAMD64/fluentbit-macosamd64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/MacOsARM64/fluentbit-macosarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/MacOsARM64/fluentbit-macosarm64-installOtelCollector.md index ef4ed9019360..07eb310d98db 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/MacOsARM64/fluentbit-macosarm64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentBit/md-docs/MacOsARM64/fluentbit-macosarm64-installOtelCollector.md @@ -2,11 +2,11 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/LinuxAMD64/fluentd-linuxamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/LinuxAMD64/fluentd-linuxamd64-installOtelCollector.md index b390df7f0d01..b759819faa14 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/LinuxAMD64/fluentd-linuxamd64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/LinuxAMD64/fluentd-linuxamd64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/LinuxARM64/fluentd-linuxarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/LinuxARM64/fluentd-linuxarm64-installOtelCollector.md index dda1f067770b..3252f7de1e34 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/LinuxARM64/fluentd-linuxarm64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/LinuxARM64/fluentd-linuxarm64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/MacOsAMD64/fluentd-macosamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/MacOsAMD64/fluentd-macosamd64-installOtelCollector.md index d85ed9c4f288..bd36ac761862 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/MacOsAMD64/fluentd-macosamd64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/MacOsAMD64/fluentd-macosamd64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/MacOsARM64/fluentd-macosarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/MacOsARM64/fluentd-macosarm64-installOtelCollector.md index ef4ed9019360..07eb310d98db 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/MacOsARM64/fluentd-macosarm64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/FluentD/md-docs/MacOsARM64/fluentd-macosarm64-installOtelCollector.md @@ -2,11 +2,11 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/LinuxAMD64/logstash-linuxamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/LinuxAMD64/logstash-linuxamd64-installOtelCollector.md index 5f09288faa16..cb13f880cd44 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/LinuxAMD64/logstash-linuxamd64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/LinuxAMD64/logstash-linuxamd64-installOtelCollector.md @@ -3,13 +3,13 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ```   ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/LinuxARM64/logstash-linuxarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/LinuxARM64/logstash-linuxarm64-installOtelCollector.md index a81fb1b71377..0f48d7c6f80a 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/LinuxARM64/logstash-linuxarm64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/LinuxARM64/logstash-linuxarm64-installOtelCollector.md @@ -3,12 +3,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/MacOsAMD64/logstash-macosamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/MacOsAMD64/logstash-macosamd64-installOtelCollector.md index ed97017f58a9..2125874059e8 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/MacOsAMD64/logstash-macosamd64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/MacOsAMD64/logstash-macosamd64-installOtelCollector.md @@ -3,12 +3,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/MacOsARM64/logstash-macosarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/MacOsARM64/logstash-macosarm64-installOtelCollector.md index 4c1af5e56764..7d23f0a0111b 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/MacOsARM64/logstash-macosarm64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/Logstash/md-docs/MacOsARM64/logstash-macosarm64-installOtelCollector.md @@ -3,11 +3,11 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ```   diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/LinuxAMD64/syslogs-linuxamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/LinuxAMD64/syslogs-linuxamd64-installOtelCollector.md index b390df7f0d01..b759819faa14 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/LinuxAMD64/syslogs-linuxamd64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/LinuxAMD64/syslogs-linuxamd64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/LinuxARM64/syslogs-linuxarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/LinuxARM64/syslogs-linuxarm64-installOtelCollector.md index dda1f067770b..3252f7de1e34 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/LinuxARM64/syslogs-linuxarm64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/LinuxARM64/syslogs-linuxarm64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_linux_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/MacOsAMD64/syslogs-macosamd64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/MacOsAMD64/syslogs-macosamd64-installOtelCollector.md index d85ed9c4f288..bd36ac761862 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/MacOsAMD64/syslogs-macosamd64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/MacOsAMD64/syslogs-macosamd64-installOtelCollector.md @@ -2,12 +2,12 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_amd64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/MacOsARM64/syslogs-macosarm64-installOtelCollector.md b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/MacOsARM64/syslogs-macosarm64-installOtelCollector.md index ef4ed9019360..07eb310d98db 100644 --- a/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/MacOsARM64/syslogs-macosarm64-installOtelCollector.md +++ b/frontend/src/container/OnboardingContainer/Modules/LogsManagement/SysLogs/md-docs/MacOsARM64/syslogs-macosarm64-installOtelCollector.md @@ -2,11 +2,11 @@ ### Step 1: Download otel-collector tar.gz ```bash -wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz +wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v{{OTEL_VERSION}}/otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz ``` ### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder ```bash -mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib +mkdir otelcol-contrib && tar xvzf otelcol-contrib_{{OTEL_VERSION}}_darwin_arm64.tar.gz -C otelcol-contrib ``` ### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it diff --git a/frontend/src/container/OnboardingContainer/Steps/MarkdownStep/MarkdownStep.tsx b/frontend/src/container/OnboardingContainer/Steps/MarkdownStep/MarkdownStep.tsx index 36b07cd191b3..ce38786deee7 100644 --- a/frontend/src/container/OnboardingContainer/Steps/MarkdownStep/MarkdownStep.tsx +++ b/frontend/src/container/OnboardingContainer/Steps/MarkdownStep/MarkdownStep.tsx @@ -84,6 +84,7 @@ export default function MarkdownStep(): JSX.Element { SIGNOZ_INGESTION_KEY: ingestionData?.SIGNOZ_INGESTION_KEY || '', REGION: ingestionData?.REGION || 'region', + OTEL_VERSION: '0.88.0', }; return ( diff --git a/frontend/src/utils/app.ts b/frontend/src/utils/app.ts index 0ab9e6fca76d..223272be2eb6 100644 --- a/frontend/src/utils/app.ts +++ b/frontend/src/utils/app.ts @@ -14,6 +14,7 @@ export function extractDomain(email: string): string { export const isCloudUser = (): boolean => { const { hostname } = window.location; + return true; return hostname?.endsWith('signoz.cloud'); }; From 3276dfa03e9937c30aafc81048fa9a62dd12a9ad Mon Sep 17 00:00:00 2001 From: CheetoDa Date: Wed, 3 Apr 2024 04:42:19 +0530 Subject: [PATCH 31/68] chore: fixed java instructions --- .../Others/Kubernetes/others-kubernetes-runApplication.md | 4 +++- .../QuickStart/others-linuxamd64-quickStart-runApplication.md | 3 ++- .../others-linuxamd64-recommended-runApplication.md | 3 ++- .../QuickStart/others-linuxarm64-quickStart-runApplication.md | 3 ++- .../others-linuxarm64-recommended-runApplication.md | 3 ++- .../QuickStart/others-macosamd64-quickStart-runApplication.md | 3 ++- .../others-macosamd64-recommended-runApplication.md | 3 ++- .../QuickStart/others-macosarm64-quickStart-runApplication.md | 3 ++- .../others-macosarm64-recommended-runApplication.md | 3 ++- .../Kubernetes/springBoot-kubernetes-runApplication.md | 3 ++- .../springBoot-linuxamd64-quickStart-runApplication.md | 3 ++- .../springBoot-linuxamd64-recommended-runApplication.md | 3 ++- .../springBoot-linuxarm64-quickStart-runApplication.md | 3 ++- .../springBoot-linuxarm64-recommended-runApplication.md | 3 ++- .../springBoot-macosamd64-quickStart-runApplication.md | 3 ++- .../springBoot-macosamd64-recommended-runApplication.md | 3 ++- .../springBoot-macosarm64-quickStart-runApplication.md | 3 ++- .../springBoot-macosarm64-recommended-runApplication.md | 3 ++- 18 files changed, 37 insertions(+), 18 deletions(-) diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Kubernetes/others-kubernetes-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Kubernetes/others-kubernetes-runApplication.md index da9b7e905f3d..83c72d549c0d 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Kubernetes/others-kubernetes-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/Kubernetes/others-kubernetes-runApplication.md @@ -3,10 +3,12 @@ Once you are done intrumenting your Java application, you can run it using the below command ```bash -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ``` - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application +   **Note:** diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxAMD64/QuickStart/others-linuxamd64-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxAMD64/QuickStart/others-linuxamd64-quickStart-runApplication.md index b89669f193f7..17534af842a7 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxAMD64/QuickStart/others-linuxamd64-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxAMD64/QuickStart/others-linuxamd64-quickStart-runApplication.md @@ -5,10 +5,11 @@ Once you are done intrumenting your Java application, you can run it using the b OTEL_RESOURCE_ATTRIBUTES=service.name={{MYAPP}} \ OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" \ OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443 \ -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ``` - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-runApplication.md index da3bcc817f35..416c01f6f1cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxAMD64/Recommended/others-linuxamd64-recommended-runApplication.md @@ -24,8 +24,9 @@ kill "$(< otel-pid)" ### Step 2: Run your application ```bash -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ``` - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxARM64/QuickStart/others-linuxarm64-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxARM64/QuickStart/others-linuxarm64-quickStart-runApplication.md index b89669f193f7..17534af842a7 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxARM64/QuickStart/others-linuxarm64-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxARM64/QuickStart/others-linuxarm64-quickStart-runApplication.md @@ -5,10 +5,11 @@ Once you are done intrumenting your Java application, you can run it using the b OTEL_RESOURCE_ATTRIBUTES=service.name={{MYAPP}} \ OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" \ OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443 \ -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ``` - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-runApplication.md index da3bcc817f35..416c01f6f1cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/LinuxARM64/Recommended/others-linuxarm64-recommended-runApplication.md @@ -24,8 +24,9 @@ kill "$(< otel-pid)" ### Step 2: Run your application ```bash -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ``` - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsAMD64/QuickStart/others-macosamd64-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsAMD64/QuickStart/others-macosamd64-quickStart-runApplication.md index b89669f193f7..17534af842a7 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsAMD64/QuickStart/others-macosamd64-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsAMD64/QuickStart/others-macosamd64-quickStart-runApplication.md @@ -5,10 +5,11 @@ Once you are done intrumenting your Java application, you can run it using the b OTEL_RESOURCE_ATTRIBUTES=service.name={{MYAPP}} \ OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" \ OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443 \ -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ``` - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-runApplication.md index da3bcc817f35..416c01f6f1cb 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsAMD64/Recommended/others-macosamd64-recommended-runApplication.md @@ -24,8 +24,9 @@ kill "$(< otel-pid)" ### Step 2: Run your application ```bash -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ``` - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsARM64/QuickStart/others-macosarm64-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsARM64/QuickStart/others-macosarm64-quickStart-runApplication.md index b89669f193f7..17534af842a7 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsARM64/QuickStart/others-macosarm64-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsARM64/QuickStart/others-macosarm64-quickStart-runApplication.md @@ -5,10 +5,11 @@ Once you are done intrumenting your Java application, you can run it using the b OTEL_RESOURCE_ATTRIBUTES=service.name={{MYAPP}} \ OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" \ OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443 \ -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ``` - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-runApplication.md index ec824bb19638..578e3ad7702f 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/Others/MacOsARM64/Recommended/others-macosarm64-recommended-runApplication.md @@ -22,8 +22,9 @@ kill "$(< otel-pid)" ``` ### Step 2: Run your application ```bash -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ``` - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Kubernetes/springBoot-kubernetes-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Kubernetes/springBoot-kubernetes-runApplication.md index bd09dabcb638..9fc92dba27a4 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Kubernetes/springBoot-kubernetes-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/Kubernetes/springBoot-kubernetes-runApplication.md @@ -4,10 +4,11 @@ Once you are done intrumenting your Java application, you can run it using the b ```bash -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ``` - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxAMD64/QuickStart/springBoot-linuxamd64-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxAMD64/QuickStart/springBoot-linuxamd64-quickStart-runApplication.md index 6cf655bbd979..17ccc780bf20 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxAMD64/QuickStart/springBoot-linuxamd64-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxAMD64/QuickStart/springBoot-linuxamd64-quickStart-runApplication.md @@ -5,10 +5,11 @@ Once you are done intrumenting your Java application, you can run it using the b OTEL_RESOURCE_ATTRIBUTES=service.name={{MYAPP}} \ OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" \ OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443 \ -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ``` - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxAMD64/Recommended/springBoot-linuxamd64-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxAMD64/Recommended/springBoot-linuxamd64-recommended-runApplication.md index cd60c65baea9..fd6a1739f225 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxAMD64/Recommended/springBoot-linuxamd64-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxAMD64/Recommended/springBoot-linuxamd64-recommended-runApplication.md @@ -25,11 +25,12 @@ kill "$(< otel-pid)" ### Step 2: Run your application ```bash -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ```   - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxARM64/QuickStart/springBoot-linuxarm64-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxARM64/QuickStart/springBoot-linuxarm64-quickStart-runApplication.md index 6cf655bbd979..17ccc780bf20 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxARM64/QuickStart/springBoot-linuxarm64-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxARM64/QuickStart/springBoot-linuxarm64-quickStart-runApplication.md @@ -5,10 +5,11 @@ Once you are done intrumenting your Java application, you can run it using the b OTEL_RESOURCE_ATTRIBUTES=service.name={{MYAPP}} \ OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" \ OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443 \ -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ``` - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxARM64/Recommended/springBoot-linuxarm64-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxARM64/Recommended/springBoot-linuxarm64-recommended-runApplication.md index cd60c65baea9..fd6a1739f225 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxARM64/Recommended/springBoot-linuxarm64-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/LinuxARM64/Recommended/springBoot-linuxarm64-recommended-runApplication.md @@ -25,11 +25,12 @@ kill "$(< otel-pid)" ### Step 2: Run your application ```bash -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ```   - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsAMD64/QuickStart/springBoot-macosamd64-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsAMD64/QuickStart/springBoot-macosamd64-quickStart-runApplication.md index 6cf655bbd979..17ccc780bf20 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsAMD64/QuickStart/springBoot-macosamd64-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsAMD64/QuickStart/springBoot-macosamd64-quickStart-runApplication.md @@ -5,10 +5,11 @@ Once you are done intrumenting your Java application, you can run it using the b OTEL_RESOURCE_ATTRIBUTES=service.name={{MYAPP}} \ OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" \ OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443 \ -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ``` - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsAMD64/Recommended/springBoot-macosamd64-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsAMD64/Recommended/springBoot-macosamd64-recommended-runApplication.md index cd60c65baea9..fd6a1739f225 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsAMD64/Recommended/springBoot-macosamd64-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsAMD64/Recommended/springBoot-macosamd64-recommended-runApplication.md @@ -25,11 +25,12 @@ kill "$(< otel-pid)" ### Step 2: Run your application ```bash -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ```   - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsARM64/QuickStart/springBoot-macosarm64-quickStart-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsARM64/QuickStart/springBoot-macosarm64-quickStart-runApplication.md index 6cf655bbd979..17ccc780bf20 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsARM64/QuickStart/springBoot-macosarm64-quickStart-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsARM64/QuickStart/springBoot-macosarm64-quickStart-runApplication.md @@ -5,10 +5,11 @@ Once you are done intrumenting your Java application, you can run it using the b OTEL_RESOURCE_ATTRIBUTES=service.name={{MYAPP}} \ OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" \ OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443 \ -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ``` - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application   diff --git a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsARM64/Recommended/springBoot-macosarm64-recommended-runApplication.md b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsARM64/Recommended/springBoot-macosarm64-recommended-runApplication.md index cd60c65baea9..fd6a1739f225 100644 --- a/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsARM64/Recommended/springBoot-macosarm64-recommended-runApplication.md +++ b/frontend/src/container/OnboardingContainer/Modules/APM/Java/md-docs/SpringBoot/MacOsARM64/Recommended/springBoot-macosarm64-recommended-runApplication.md @@ -25,11 +25,12 @@ kill "$(< otel-pid)" ### Step 2: Run your application ```bash -java -javaagent:/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar +java -javaagent:/opentelemetry-javaagent.jar -jar .jar ```   - update it to the path where you downloaded the Java JAR agent in previous step + - Jar file of your application   From c76cef47ba366d8c9eb36ed61f5c94fcb5de4c98 Mon Sep 17 00:00:00 2001 From: Vikrant Gupta Date: Wed, 3 Apr 2024 12:31:38 +0530 Subject: [PATCH 32/68] fix: remove integrations page view and add event for the same (#4802) --- frontend/src/pages/Integrations/Integrations.tsx | 4 ++-- frontend/src/pages/Integrations/utils.ts | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/Integrations/Integrations.tsx b/frontend/src/pages/Integrations/Integrations.tsx index 1f1644fbc783..187c77f4f684 100644 --- a/frontend/src/pages/Integrations/Integrations.tsx +++ b/frontend/src/pages/Integrations/Integrations.tsx @@ -15,7 +15,7 @@ function Integrations(): JSX.Element { const history = useHistory(); const location = useLocation(); - const { trackPageView, trackEvent } = useAnalytics(); + const { trackEvent } = useAnalytics(); const selectedIntegration = useMemo(() => urlQuery.get('integration'), [ urlQuery, @@ -42,7 +42,7 @@ function Integrations(): JSX.Element { ); useEffect(() => { - trackPageView(location.pathname); + trackEvent(INTEGRATION_TELEMETRY_EVENTS.INTEGRATIONS_LIST_VISITED); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/frontend/src/pages/Integrations/utils.ts b/frontend/src/pages/Integrations/utils.ts index a244da4c8221..0785eb89c035 100644 --- a/frontend/src/pages/Integrations/utils.ts +++ b/frontend/src/pages/Integrations/utils.ts @@ -9,6 +9,7 @@ export const handleContactSupport = (isCloudUser: boolean): void => { }; export const INTEGRATION_TELEMETRY_EVENTS = { + INTEGRATIONS_LIST_VISITED: 'Integrations Page: Visited the list page', INTEGRATIONS_ITEM_LIST_CLICKED: 'Integrations Page: Clicked an integration', INTEGRATIONS_DETAIL_CONNECT: 'Integrations Detail Page: Clicked connect integration button', From 87534b6fb6c200f00b71e840cadd79a706284998 Mon Sep 17 00:00:00 2001 From: Srikanth Chekuri Date: Wed, 3 Apr 2024 16:42:00 +0530 Subject: [PATCH 33/68] fix: incorrect error rate query (#4805) --- pkg/query-service/app/clickhouseReader/reader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/query-service/app/clickhouseReader/reader.go b/pkg/query-service/app/clickhouseReader/reader.go index 57d7318ee485..d795599845a8 100644 --- a/pkg/query-service/app/clickhouseReader/reader.go +++ b/pkg/query-service/app/clickhouseReader/reader.go @@ -879,7 +879,7 @@ func (r *ClickHouseReader) GetServices(ctx context.Context, queryParams *model.G zap.L().Error("Error building query with tag params", zap.Error(errStatus)) return } - query += subQuery + errorQuery += subQuery args = append(args, argsSubQuery...) err = r.db.QueryRow(ctx, errorQuery, args...).Scan(&numErrors) if err != nil { From a7b0ef55add657bdfe66cc75ddd46ed49315863f Mon Sep 17 00:00:00 2001 From: Nityananda Gohain Date: Wed, 3 Apr 2024 17:52:45 +0530 Subject: [PATCH 34/68] fix: querier v2 synced and tablePanel result processor updated (#4807) --- pkg/query-service/app/http_handler.go | 22 ++ pkg/query-service/app/querier/v2/helper.go | 210 +++++++++++++++----- pkg/query-service/app/querier/v2/querier.go | 13 ++ 3 files changed, 190 insertions(+), 55 deletions(-) diff --git a/pkg/query-service/app/http_handler.go b/pkg/query-service/app/http_handler.go index 7f9e6795a77d..9244700af063 100644 --- a/pkg/query-service/app/http_handler.go +++ b/pkg/query-service/app/http_handler.go @@ -3722,6 +3722,7 @@ func (aH *APIHandler) queryRangeV4(ctx context.Context, queryRangeParams *v3.Que } if queryRangeParams.CompositeQuery.QueryType == v3.QueryTypeBuilder { + result, err = postProcessResult(result, queryRangeParams) } @@ -3786,6 +3787,12 @@ func postProcessResult(result []*v3.Result, queryRangeParams *v3.QueryRangeParam // We apply the functions here it's easier to add new functions applyFunctions(result, queryRangeParams) + // expressions are executed at query serivce so the value of time.now in the invdividual + // queries will be different so for table panel we are making it same. + if queryRangeParams.CompositeQuery.PanelType == v3.PanelTypeTable { + tablePanelResultProcessor(result) + } + for _, query := range queryRangeParams.CompositeQuery.BuilderQueries { // The way we distinguish between a formula and a query is by checking if the expression // is the same as the query name @@ -3838,3 +3845,18 @@ func applyFunctions(results []*v3.Result, queryRangeParams *v3.QueryRangeParamsV } } } + +func tablePanelResultProcessor(results []*v3.Result) { + var ts int64 + for ridx := range results { + for sidx := range results[ridx].Series { + for pidx := range results[ridx].Series[sidx].Points { + if ts == 0 { + ts = results[ridx].Series[sidx].Points[pidx].Timestamp + } else { + results[ridx].Series[sidx].Points[pidx].Timestamp = ts + } + } + } + } +} diff --git a/pkg/query-service/app/querier/v2/helper.go b/pkg/query-service/app/querier/v2/helper.go index e564956f19cf..cc4e83b70260 100644 --- a/pkg/query-service/app/querier/v2/helper.go +++ b/pkg/query-service/app/querier/v2/helper.go @@ -18,6 +18,61 @@ import ( "go.uber.org/zap" ) +func prepareLogsQuery(ctx context.Context, + start, + end int64, + builderQuery *v3.BuilderQuery, + params *v3.QueryRangeParamsV3, + preferRPM bool, +) (string, error) { + query := "" + + if params == nil || builderQuery == nil { + return query, fmt.Errorf("params and builderQuery cannot be nil") + } + + // for ts query with limit replace it as it is already formed + if params.CompositeQuery.PanelType == v3.PanelTypeGraph && builderQuery.Limit > 0 && len(builderQuery.GroupBy) > 0 { + limitQuery, err := logsV3.PrepareLogsQuery( + start, + end, + params.CompositeQuery.QueryType, + params.CompositeQuery.PanelType, + builderQuery, + logsV3.Options{GraphLimitQtype: constants.FirstQueryGraphLimit, PreferRPM: preferRPM}, + ) + if err != nil { + return query, err + } + placeholderQuery, err := logsV3.PrepareLogsQuery( + start, + end, + params.CompositeQuery.QueryType, + params.CompositeQuery.PanelType, + builderQuery, + logsV3.Options{GraphLimitQtype: constants.SecondQueryGraphLimit, PreferRPM: preferRPM}, + ) + if err != nil { + return query, err + } + query = strings.Replace(placeholderQuery, "#LIMIT_PLACEHOLDER", limitQuery, 1) + return query, err + } + + query, err := logsV3.PrepareLogsQuery( + start, + end, + params.CompositeQuery.QueryType, + params.CompositeQuery.PanelType, + builderQuery, + logsV3.Options{PreferRPM: preferRPM}, + ) + if err != nil { + return query, err + } + return query, err +} + func (q *querier) runBuilderQuery( ctx context.Context, builderQuery *v3.BuilderQuery, @@ -48,54 +103,82 @@ func (q *querier) runBuilderQuery( if builderQuery.DataSource == v3.DataSourceLogs { var query string var err error - // for ts query with limit replace it as it is already formed - if params.CompositeQuery.PanelType == v3.PanelTypeGraph && builderQuery.Limit > 0 && len(builderQuery.GroupBy) > 0 { - limitQuery, err := logsV3.PrepareLogsQuery( - start, - end, - params.CompositeQuery.QueryType, - params.CompositeQuery.PanelType, - builderQuery, - logsV3.Options{GraphLimitQtype: constants.FirstQueryGraphLimit, PreferRPM: preferRPM}, - ) - if err != nil { - ch <- channelResult{Err: err, Name: queryName, Query: limitQuery, Series: nil} - return - } - placeholderQuery, err := logsV3.PrepareLogsQuery( - start, - end, - params.CompositeQuery.QueryType, - params.CompositeQuery.PanelType, - builderQuery, - logsV3.Options{GraphLimitQtype: constants.SecondQueryGraphLimit, PreferRPM: preferRPM}, - ) - if err != nil { - ch <- channelResult{Err: err, Name: queryName, Query: placeholderQuery, Series: nil} - return - } - query = strings.Replace(placeholderQuery, "#LIMIT_PLACEHOLDER", limitQuery, 1) - } else { - query, err = logsV3.PrepareLogsQuery( - start, - end, - params.CompositeQuery.QueryType, - params.CompositeQuery.PanelType, - builderQuery, - logsV3.Options{PreferRPM: preferRPM}, - ) + if _, ok := cacheKeys[queryName]; !ok { + query, err = prepareLogsQuery(ctx, start, end, builderQuery, params, preferRPM) if err != nil { ch <- channelResult{Err: err, Name: queryName, Query: query, Series: nil} return } - } - - if err != nil { - ch <- channelResult{Err: err, Name: queryName, Query: query, Series: nil} + series, err := q.execClickHouseQuery(ctx, query) + ch <- channelResult{Err: err, Name: queryName, Query: query, Series: series} return } - series, err := q.execClickHouseQuery(ctx, query) - ch <- channelResult{Err: err, Name: queryName, Query: query, Series: series} + cacheKey := cacheKeys[queryName] + var cachedData []byte + if !params.NoCache && q.cache != nil { + var retrieveStatus status.RetrieveStatus + data, retrieveStatus, err := q.cache.Retrieve(cacheKey, true) + zap.L().Info("cache retrieve status", zap.String("status", retrieveStatus.String())) + if err == nil { + cachedData = data + } + } + misses := q.findMissingTimeRanges(start, end, params.Step, cachedData) + missedSeries := make([]*v3.Series, 0) + cachedSeries := make([]*v3.Series, 0) + for _, miss := range misses { + query, err = prepareLogsQuery(ctx, miss.start, miss.end, builderQuery, params, preferRPM) + if err != nil { + ch <- channelResult{Err: err, Name: queryName, Query: query, Series: nil} + return + } + series, err := q.execClickHouseQuery(ctx, query) + if err != nil { + ch <- channelResult{ + Err: err, + Name: queryName, + Query: query, + Series: nil, + } + return + } + missedSeries = append(missedSeries, series...) + } + if err := json.Unmarshal(cachedData, &cachedSeries); err != nil && cachedData != nil { + zap.L().Error("error unmarshalling cached data", zap.Error(err)) + } + mergedSeries := mergeSerieses(cachedSeries, missedSeries) + + var mergedSeriesData []byte + var marshallingErr error + missedSeriesLen := len(missedSeries) + if missedSeriesLen > 0 && !params.NoCache && q.cache != nil { + // caching the data + mergedSeriesData, marshallingErr = json.Marshal(mergedSeries) + if marshallingErr != nil { + zap.L().Error("error marshalling merged series", zap.Error(marshallingErr)) + } + } + + // response doesn't need everything + filterCachedPoints(mergedSeries, start, end) + + ch <- channelResult{ + Err: nil, + Name: queryName, + Series: mergedSeries, + } + + // Cache the seriesList for future queries + if missedSeriesLen > 0 && !params.NoCache && q.cache != nil && marshallingErr == nil { + // caching the data + err = q.cache.Store(cacheKey, mergedSeriesData, time.Hour) + if err != nil { + zap.L().Error("error storing merged series", zap.Error(err)) + return + } + } + return } @@ -211,6 +294,19 @@ func (q *querier) runBuilderQuery( zap.L().Error("error unmarshalling cached data", zap.Error(err)) } mergedSeries := mergeSerieses(cachedSeries, missedSeries) + var mergedSeriesData []byte + var marshallingErr error + missedSeriesLen := len(missedSeries) + if missedSeriesLen > 0 && !params.NoCache && q.cache != nil { + // caching the data + mergedSeriesData, marshallingErr = json.Marshal(mergedSeries) + if marshallingErr != nil { + zap.S().Error("error marshalling merged series", zap.Error(marshallingErr)) + } + } + + // response doesn't need everything + filterCachedPoints(mergedSeries, params.Start, params.End) ch <- channelResult{ Err: nil, @@ -218,13 +314,8 @@ func (q *querier) runBuilderQuery( Series: mergedSeries, } // Cache the seriesList for future queries - if len(missedSeries) > 0 && !params.NoCache && q.cache != nil { - mergedSeriesData, err := json.Marshal(mergedSeries) - if err != nil { - zap.L().Error("error marshalling merged series", zap.Error(err)) - return - } - err = q.cache.Store(cacheKey, mergedSeriesData, time.Hour) + if missedSeriesLen > 0 && !params.NoCache && q.cache != nil && marshallingErr == nil { + err := q.cache.Store(cacheKey, mergedSeriesData, time.Hour) if err != nil { zap.L().Error("error storing merged series", zap.Error(err)) return @@ -293,18 +384,27 @@ func (q *querier) runBuilderExpression( } mergedSeries := mergeSerieses(cachedSeries, missedSeries) + var mergedSeriesData []byte + missedSeriesLen := len(missedSeries) + var marshallingErr error + if missedSeriesLen > 0 && !params.NoCache && q.cache != nil { + // caching the data + mergedSeriesData, marshallingErr = json.Marshal(mergedSeries) + if marshallingErr != nil { + zap.S().Error("error marshalling merged series", zap.Error(marshallingErr)) + } + } + + // response doesn't need everything + filterCachedPoints(mergedSeries, params.Start, params.End) + ch <- channelResult{ Err: nil, Name: queryName, Series: mergedSeries, } // Cache the seriesList for future queries - if len(missedSeries) > 0 && !params.NoCache && q.cache != nil { - mergedSeriesData, err := json.Marshal(mergedSeries) - if err != nil { - zap.L().Error("error marshalling merged series", zap.Error(err)) - return - } + if len(missedSeries) > 0 && !params.NoCache && q.cache != nil && marshallingErr == nil { err = q.cache.Store(cacheKey, mergedSeriesData, time.Hour) if err != nil { zap.L().Error("error storing merged series", zap.Error(err)) diff --git a/pkg/query-service/app/querier/v2/querier.go b/pkg/query-service/app/querier/v2/querier.go index e45153da7d60..47933e847df1 100644 --- a/pkg/query-service/app/querier/v2/querier.go +++ b/pkg/query-service/app/querier/v2/querier.go @@ -241,6 +241,19 @@ func labelsToString(labels map[string]string) string { return fmt.Sprintf("{%s}", strings.Join(labelKVs, ",")) } +func filterCachedPoints(cachedSeries []*v3.Series, start, end int64) { + for _, c := range cachedSeries { + points := []v3.Point{} + for _, p := range c.Points { + if p.Timestamp < start || p.Timestamp > end { + continue + } + points = append(points, p) + } + c.Points = points + } +} + func mergeSerieses(cachedSeries, missedSeries []*v3.Series) []*v3.Series { // Merge the missed series with the cached series by timestamp mergedSeries := make([]*v3.Series, 0) From 6a4aa9a956b4b6536f60e7b47cb75d17bcdc5f55 Mon Sep 17 00:00:00 2001 From: Yunus M Date: Thu, 4 Apr 2024 11:05:58 +0530 Subject: [PATCH 35/68] QB - Logs - Enable TimeShift function (#4792) * feat: qb - logs - enable time shift function * feat: qb - logs - enable time shift function * feat: show functions for logs in v3 version too --- .../src/constants/queryFunctionOptions.ts | 8 +++++- .../container/FormAlertRules/QuerySection.tsx | 5 ++-- .../QBEntityOptions.styles.scss | 1 + .../QBEntityOptions/QBEntityOptions.tsx | 7 ++++- .../QueryBuilder/components/Query/Query.tsx | 6 ++++- .../components/QueryFunctions/Function.tsx | 19 +++++++++++--- .../QueryFunctions/QueryFunctions.tsx | 26 ++++++++++++++++--- .../queryBuilder/useQueryBuilderOperations.ts | 7 ++++- 8 files changed, 66 insertions(+), 13 deletions(-) diff --git a/frontend/src/constants/queryFunctionOptions.ts b/frontend/src/constants/queryFunctionOptions.ts index b79f673c46c0..4aa6332d67bd 100644 --- a/frontend/src/constants/queryFunctionOptions.ts +++ b/frontend/src/constants/queryFunctionOptions.ts @@ -2,7 +2,7 @@ import { QueryFunctionsTypes } from 'types/common/queryBuilder'; import { SelectOption } from 'types/common/select'; -export const queryFunctionOptions: SelectOption[] = [ +export const metricQueryFunctionOptions: SelectOption[] = [ { value: QueryFunctionsTypes.CUTOFF_MIN, label: 'Cut Off Min', @@ -65,6 +65,12 @@ export const queryFunctionOptions: SelectOption[] = [ }, ]; +export const logsQueryFunctionOptions: SelectOption[] = [ + { + value: QueryFunctionsTypes.TIME_SHIFT, + label: 'Time Shift', + }, +]; interface QueryFunctionConfigType { [key: string]: { showInput: boolean; diff --git a/frontend/src/container/FormAlertRules/QuerySection.tsx b/frontend/src/container/FormAlertRules/QuerySection.tsx index 1604cdb92940..406a757eda87 100644 --- a/frontend/src/container/FormAlertRules/QuerySection.tsx +++ b/frontend/src/container/FormAlertRules/QuerySection.tsx @@ -56,8 +56,9 @@ function QuerySection({ initialDataSource: ALERTS_DATA_SOURCE_MAP[alertType], }} showFunctions={ - alertType === AlertTypes.METRICS_BASED_ALERT && - alertDef.version === ENTITY_VERSION_V4 + (alertType === AlertTypes.METRICS_BASED_ALERT && + alertDef.version === ENTITY_VERSION_V4) || + alertType === AlertTypes.LOGS_BASED_ALERT } version={alertDef.version || 'v3'} /> diff --git a/frontend/src/container/QueryBuilder/components/QBEntityOptions/QBEntityOptions.styles.scss b/frontend/src/container/QueryBuilder/components/QBEntityOptions/QBEntityOptions.styles.scss index 3bafb59879dc..f0c7565d2926 100644 --- a/frontend/src/container/QueryBuilder/components/QBEntityOptions/QBEntityOptions.styles.scss +++ b/frontend/src/container/QueryBuilder/components/QBEntityOptions/QBEntityOptions.styles.scss @@ -77,6 +77,7 @@ .qb-entity-options { .options { border-color: var(--bg-vanilla-300); + box-shadow: none; .periscope-btn { border-color: var(--bg-vanilla-300); diff --git a/frontend/src/container/QueryBuilder/components/QBEntityOptions/QBEntityOptions.tsx b/frontend/src/container/QueryBuilder/components/QBEntityOptions/QBEntityOptions.tsx index 8730506a888a..fd8e860508c5 100644 --- a/frontend/src/container/QueryBuilder/components/QBEntityOptions/QBEntityOptions.tsx +++ b/frontend/src/container/QueryBuilder/components/QBEntityOptions/QBEntityOptions.tsx @@ -17,6 +17,7 @@ import { IBuilderQuery, QueryFunctionProps, } from 'types/api/queryBuilder/queryBuilderData'; +import { DataSource } from 'types/common/queryBuilder'; import QueryFunctions from '../QueryFunctions/QueryFunctions'; @@ -57,6 +58,8 @@ export default function QBEntityOptions({ } }; + const isLogsDataSource = query?.dataSource === DataSource.LOGS; + return (
@@ -97,12 +100,14 @@ export default function QBEntityOptions({ {showFunctions && - isMetricsDataSource && + (isMetricsDataSource || isLogsDataSource) && query && onQueryFunctionsUpdates && ( )} diff --git a/frontend/src/container/QueryBuilder/components/Query/Query.tsx b/frontend/src/container/QueryBuilder/components/Query/Query.tsx index 1bb761fde781..fb8b0e15611c 100644 --- a/frontend/src/container/QueryBuilder/components/Query/Query.tsx +++ b/frontend/src/container/QueryBuilder/components/Query/Query.tsx @@ -36,6 +36,7 @@ import { } from 'react'; import { useLocation } from 'react-use'; import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; +import { DataSource } from 'types/common/queryBuilder'; import { transformToUpperCase } from 'utils/transformToUpperCase'; import QBEntityOptions from '../QBEntityOptions/QBEntityOptions'; @@ -324,7 +325,10 @@ export const Query = memo(function Query({ - {GraphTypes.map((item) => ( + {graphTypes.map((item) => ( diff --git a/frontend/src/container/NewWidget/index.tsx b/frontend/src/container/NewWidget/index.tsx index 546ffecbc33c..17802d46580d 100644 --- a/frontend/src/container/NewWidget/index.tsx +++ b/frontend/src/container/NewWidget/index.tsx @@ -3,6 +3,7 @@ import { LockFilled, WarningOutlined } from '@ant-design/icons'; import { Button, Modal, Space, Tooltip, Typography } from 'antd'; import { SOMETHING_WENT_WRONG } from 'constants/api'; import { FeatureKeys } from 'constants/features'; +import { QueryParams } from 'constants/query'; import { PANEL_TYPES } from 'constants/queryBuilder'; import ROUTES from 'constants/routes'; import { DashboardShortcuts } from 'constants/shortcuts/DashboardShortcuts'; @@ -23,7 +24,7 @@ import { import { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useSelector } from 'react-redux'; -import { generatePath, useLocation, useParams } from 'react-router-dom'; +import { generatePath, useParams } from 'react-router-dom'; import { AppState } from 'store/reducers'; import { Dashboard, Widgets } from 'types/api/dashboard/getAll'; import { IField } from 'types/api/logs/fields'; @@ -44,7 +45,7 @@ import { RightContainerWrapper, } from './styles'; import { NewWidgetProps } from './types'; -import { getIsQueryModified } from './utils'; +import { getIsQueryModified, handleQueryChange } from './utils'; function NewWidget({ selectedGraph }: NewWidgetProps): JSX.Element { const { @@ -57,7 +58,12 @@ function NewWidget({ selectedGraph }: NewWidgetProps): JSX.Element { const { registerShortcut, deregisterShortcut } = useKeyboardHotkeys(); - const { currentQuery, stagedQuery } = useQueryBuilder(); + const { + currentQuery, + stagedQuery, + redirectWithQueryBuilderData, + supersetQuery, + } = useQueryBuilder(); const isQueryModified = useMemo( () => getIsQueryModified(currentQuery, stagedQuery), @@ -70,8 +76,6 @@ function NewWidget({ selectedGraph }: NewWidgetProps): JSX.Element { const { widgets = [] } = selectedDashboard?.data || {}; - const { search } = useLocation(); - const query = useUrlQuery(); const { dashboardId } = useParams(); @@ -297,9 +301,14 @@ function NewWidget({ selectedGraph }: NewWidgetProps): JSX.Element { }, [dashboardId]); const setGraphHandler = (type: PANEL_TYPES): void => { - const params = new URLSearchParams(search); - params.set('graphType', type); + const updatedQuery = handleQueryChange(type as any, supersetQuery); setGraphType(type); + redirectWithQueryBuilderData( + updatedQuery, + { [QueryParams.graphType]: type }, + undefined, + false, + ); }; const onSaveDashboard = useCallback((): void => { diff --git a/frontend/src/container/NewWidget/utils.ts b/frontend/src/container/NewWidget/utils.ts index 15fcd278d7c5..6a1eceab95c2 100644 --- a/frontend/src/container/NewWidget/utils.ts +++ b/frontend/src/container/NewWidget/utils.ts @@ -1,6 +1,11 @@ import { omitIdFromQuery } from 'components/ExplorerCard/utils'; -import { isEqual } from 'lodash-es'; -import { Query } from 'types/api/queryBuilder/queryBuilderData'; +import { + initialQueryBuilderFormValuesMap, + PANEL_TYPES, +} from 'constants/queryBuilder'; +import { isEqual, set, unset } from 'lodash-es'; +import { IBuilderQuery, Query } from 'types/api/queryBuilder/queryBuilderData'; +import { DataSource } from 'types/common/queryBuilder'; export const getIsQueryModified = ( currentQuery: Query, @@ -13,3 +18,242 @@ export const getIsQueryModified = ( const omitIdFromCurrentQuery = omitIdFromQuery(currentQuery); return !isEqual(omitIdFromStageQuery, omitIdFromCurrentQuery); }; + +export type PartialPanelTypes = { + [PANEL_TYPES.BAR]: 'bar'; + [PANEL_TYPES.LIST]: 'list'; + [PANEL_TYPES.TABLE]: 'table'; + [PANEL_TYPES.TIME_SERIES]: 'graph'; + [PANEL_TYPES.VALUE]: 'value'; +}; + +export const panelTypeDataSourceFormValuesMap: Record< + keyof PartialPanelTypes, + Record +> = { + [PANEL_TYPES.BAR]: { + [DataSource.LOGS]: { + builder: { + queryData: [ + 'filters', + 'aggregateOperator', + 'aggregateAttribute', + 'groupBy', + 'limit', + 'having', + 'orderBy', + 'functions', + ], + }, + }, + [DataSource.METRICS]: { + builder: { + queryData: [ + 'filters', + 'aggregateOperator', + 'aggregateAttribute', + 'groupBy', + 'limit', + 'having', + 'orderBy', + 'functions', + 'spaceAggregation', + ], + }, + }, + [DataSource.TRACES]: { + builder: { + queryData: [ + 'filters', + 'aggregateOperator', + 'aggregateAttribute', + 'groupBy', + 'limit', + 'having', + 'orderBy', + ], + }, + }, + }, + [PANEL_TYPES.TIME_SERIES]: { + [DataSource.LOGS]: { + builder: { + queryData: [ + 'filters', + 'aggregateOperator', + 'aggregateAttribute', + 'groupBy', + 'limit', + 'having', + 'orderBy', + 'functions', + ], + }, + }, + [DataSource.METRICS]: { + builder: { + queryData: [ + 'filters', + 'aggregateOperator', + 'aggregateAttribute', + 'groupBy', + 'limit', + 'having', + 'orderBy', + 'functions', + 'spaceAggregation', + ], + }, + }, + [DataSource.TRACES]: { + builder: { + queryData: [ + 'filters', + 'aggregateOperator', + 'aggregateAttribute', + 'groupBy', + 'limit', + 'having', + 'orderBy', + ], + }, + }, + }, + [PANEL_TYPES.TABLE]: { + [DataSource.LOGS]: { + builder: { + queryData: [ + 'filters', + 'aggregateOperator', + 'aggregateAttribute', + 'groupBy', + 'limit', + 'having', + 'orderBy', + 'functions', + ], + }, + }, + [DataSource.METRICS]: { + builder: { + queryData: [ + 'filters', + 'aggregateOperator', + 'aggregateAttribute', + 'groupBy', + 'limit', + 'having', + 'orderBy', + 'functions', + 'spaceAggregation', + ], + }, + }, + [DataSource.TRACES]: { + builder: { + queryData: [ + 'filters', + 'aggregateOperator', + 'aggregateAttribute', + 'groupBy', + 'limit', + 'having', + 'orderBy', + ], + }, + }, + }, + [PANEL_TYPES.LIST]: { + [DataSource.LOGS]: { + builder: { + queryData: ['filters', 'limit', 'orderBy'], + }, + }, + [DataSource.METRICS]: { + builder: { + queryData: [], + }, + }, + [DataSource.TRACES]: { + builder: { + queryData: ['filters', 'limit', 'orderBy'], + }, + }, + }, + [PANEL_TYPES.VALUE]: { + [DataSource.LOGS]: { + builder: { + queryData: [ + 'filters', + 'aggregateOperator', + 'aggregateAttribute', + 'reduceTo', + 'having', + 'functions', + ], + }, + }, + [DataSource.METRICS]: { + builder: { + queryData: [ + 'filters', + 'aggregateOperator', + 'aggregateAttribute', + 'having', + 'reduceTo', + 'functions', + 'spaceAggregation', + ], + }, + }, + [DataSource.TRACES]: { + builder: { + queryData: [ + 'filters', + 'aggregateOperator', + 'aggregateAttribute', + 'groupBy', + 'limit', + 'having', + 'orderBy', + ], + }, + }, + }, +}; + +export function handleQueryChange( + newPanelType: keyof PartialPanelTypes, + supersetQuery: Query, +): Query { + return { + ...supersetQuery, + builder: { + ...supersetQuery.builder, + queryData: supersetQuery.builder.queryData.map((query, index) => { + const { dataSource } = query; + const tempQuery = { ...initialQueryBuilderFormValuesMap[dataSource] }; + + const fieldsToSelect = + panelTypeDataSourceFormValuesMap[newPanelType][dataSource].builder + .queryData; + + fieldsToSelect.forEach((field: keyof IBuilderQuery) => { + set(tempQuery, field, supersetQuery.builder.queryData[index][field]); + }); + + if (newPanelType === PANEL_TYPES.LIST) { + set(tempQuery, 'aggregateOperator', 'noop'); + set(tempQuery, 'offset', 0); + set(tempQuery, 'pageSize', 10); + } else if (tempQuery.aggregateOperator === 'noop') { + set(tempQuery, 'aggregateOperator', 'count'); + unset(tempQuery, 'offset'); + unset(tempQuery, 'pageSize'); + } + + return tempQuery; + }), + }, + }; +} diff --git a/frontend/src/container/PanelWrapper/PanelWrapper.tsx b/frontend/src/container/PanelWrapper/PanelWrapper.tsx index 87090ac6c11f..4e8d7eff9666 100644 --- a/frontend/src/container/PanelWrapper/PanelWrapper.tsx +++ b/frontend/src/container/PanelWrapper/PanelWrapper.tsx @@ -13,9 +13,10 @@ function PanelWrapper({ onToggleModelHandler, onClickHandler, onDragSelect, + selectedGraph, }: PanelWrapperProps): JSX.Element { const Component = PanelTypeVsPanelWrapper[ - widget.panelTypes + selectedGraph || widget.panelTypes ] as FC; if (!Component) { @@ -33,6 +34,7 @@ function PanelWrapper({ onToggleModelHandler={onToggleModelHandler} onClickHandler={onClickHandler} onDragSelect={onDragSelect} + selectedGraph={selectedGraph} /> ); } diff --git a/frontend/src/container/PanelWrapper/UplotPanelWrapper.tsx b/frontend/src/container/PanelWrapper/UplotPanelWrapper.tsx index 256ff3f90bfc..f95d5772afb9 100644 --- a/frontend/src/container/PanelWrapper/UplotPanelWrapper.tsx +++ b/frontend/src/container/PanelWrapper/UplotPanelWrapper.tsx @@ -25,6 +25,7 @@ function UplotPanelWrapper({ onToggleModelHandler, onClickHandler, onDragSelect, + selectedGraph, }: PanelWrapperProps): JSX.Element { const { toScrollWidgetId, setToScrollWidgetId } = useDashboard(); const isDarkMode = useIsDarkMode(); @@ -96,7 +97,7 @@ function UplotPanelWrapper({ softMin: widget.softMin === undefined ? null : widget.softMin, graphsVisibilityStates: graphVisibility, setGraphsVisibilityStates: setGraphVisibility, - panelType: widget.panelTypes, + panelType: selectedGraph || widget.panelTypes, currentQuery, }), [ @@ -115,6 +116,7 @@ function UplotPanelWrapper({ maxTimeScale, graphVisibility, setGraphVisibility, + selectedGraph, currentQuery, ], ); diff --git a/frontend/src/container/PanelWrapper/panelWrapper.types.ts b/frontend/src/container/PanelWrapper/panelWrapper.types.ts index e5a53a85ffda..e26f8b5cab69 100644 --- a/frontend/src/container/PanelWrapper/panelWrapper.types.ts +++ b/frontend/src/container/PanelWrapper/panelWrapper.types.ts @@ -1,3 +1,4 @@ +import { PANEL_TYPES } from 'constants/queryBuilder'; import { WidgetGraphComponentProps } from 'container/GridCardLayout/GridCard/types'; import { OnClickPluginOpts } from 'lib/uPlotLib/plugins/onClickPlugin'; import { Dispatch, SetStateAction } from 'react'; @@ -19,4 +20,5 @@ export type PanelWrapperProps = { setGraphVisibility?: Dispatch>; onClickHandler?: OnClickPluginOpts['onClick']; onDragSelect: (start: number, end: number) => void; + selectedGraph?: PANEL_TYPES; }; diff --git a/frontend/src/providers/QueryBuilder.tsx b/frontend/src/providers/QueryBuilder.tsx index 1fde9fc224bd..460b2b5f48fe 100644 --- a/frontend/src/providers/QueryBuilder.tsx +++ b/frontend/src/providers/QueryBuilder.tsx @@ -16,6 +16,10 @@ import { PANEL_TYPES, } from 'constants/queryBuilder'; import ROUTES from 'constants/routes'; +import { + panelTypeDataSourceFormValuesMap, + PartialPanelTypes, +} from 'container/NewWidget/utils'; import { useGetCompositeQueryParam } from 'hooks/queryBuilder/useGetCompositeQueryParam'; import { updateStepInterval } from 'hooks/queryBuilder/useStepInterval'; import useUrlQuery from 'hooks/useUrlQuery'; @@ -23,7 +27,7 @@ import { createIdFromObjectFields } from 'lib/createIdFromObjectFields'; import { createNewBuilderItemName } from 'lib/newQueryBuilder/createNewBuilderItemName'; import { getOperatorsBySourceAndPanelType } from 'lib/newQueryBuilder/getOperatorsBySourceAndPanelType'; import { replaceIncorrectObjectFields } from 'lib/replaceIncorrectObjectFields'; -import { merge } from 'lodash-es'; +import { get, merge, set } from 'lodash-es'; import { createContext, PropsWithChildren, @@ -57,6 +61,8 @@ import { v4 as uuid } from 'uuid'; export const QueryBuilderContext = createContext({ currentQuery: initialQueriesMap.metrics, + supersetQuery: initialQueriesMap.metrics, + setSupersetQuery: () => {}, stagedQuery: initialQueriesMap.metrics, initialDataSource: null, panelType: PANEL_TYPES.TIME_SERIES, @@ -110,6 +116,7 @@ export function QueryBuilderProvider({ ); const [currentQuery, setCurrentQuery] = useState(queryState); + const [supersetQuery, setSupersetQuery] = useState(queryState); const [stagedQuery, setStagedQuery] = useState(null); const [queryType, setQueryType] = useState(queryTypeParam); @@ -263,6 +270,21 @@ export function QueryBuilderProvider({ const filteredArray = currentArray.filter((_, i) => index !== i); + return { + ...prevState, + builder: { + ...prevState.builder, + [type]: filteredArray, + }, + }; + }); + // eslint-disable-next-line sonarjs/no-identical-functions + setSupersetQuery((prevState) => { + const currentArray: (IBuilderQuery | IBuilderFormula)[] = + prevState.builder[type]; + + const filteredArray = currentArray.filter((_, i) => index !== i); + return { ...prevState, builder: { @@ -284,6 +306,14 @@ export function QueryBuilderProvider({ [type]: targetArray.filter((_, i) => index !== i), }; }); + // eslint-disable-next-line sonarjs/no-identical-functions + setSupersetQuery((prevState) => { + const targetArray: (IPromQLQuery | IClickHouseQuery)[] = prevState[type]; + return { + ...prevState, + [type]: targetArray.filter((_, i) => index !== i), + }; + }); }, [], ); @@ -366,6 +396,17 @@ export function QueryBuilderProvider({ const newQuery = createNewQueryTypeItem(prevState[type], type); + return { + ...prevState, + [type]: [...prevState[type], newQuery], + }; + }); + // eslint-disable-next-line sonarjs/no-identical-functions + setSupersetQuery((prevState) => { + if (prevState[type].length >= MAX_QUERIES) return prevState; + + const newQuery = createNewQueryTypeItem(prevState[type], type); + return { ...prevState, [type]: [...prevState[type], newQuery], @@ -381,6 +422,20 @@ export function QueryBuilderProvider({ const newQuery = createNewBuilderQuery(prevState.builder.queryData); + return { + ...prevState, + builder: { + ...prevState.builder, + queryData: [...prevState.builder.queryData, newQuery], + }, + }; + }); + // eslint-disable-next-line sonarjs/no-identical-functions + setSupersetQuery((prevState) => { + if (prevState.builder.queryData.length >= MAX_QUERIES) return prevState; + + const newQuery = createNewBuilderQuery(prevState.builder.queryData); + return { ...prevState, builder: { @@ -401,6 +456,23 @@ export function QueryBuilderProvider({ query, ); + return { + ...prevState, + builder: { + ...prevState.builder, + queryData: [...prevState.builder.queryData, clonedQuery], + }, + }; + }); + // eslint-disable-next-line sonarjs/no-identical-functions + setSupersetQuery((prevState) => { + if (prevState.builder.queryData.length >= MAX_QUERIES) return prevState; + + const clonedQuery = cloneNewBuilderQuery( + prevState.builder.queryData, + query, + ); + return { ...prevState, builder: { @@ -419,6 +491,20 @@ export function QueryBuilderProvider({ const newFormula = createNewBuilderFormula(prevState.builder.queryFormulas); + return { + ...prevState, + builder: { + ...prevState.builder, + queryFormulas: [...prevState.builder.queryFormulas, newFormula], + }, + }; + }); + // eslint-disable-next-line sonarjs/no-identical-functions + setSupersetQuery((prevState) => { + if (prevState.builder.queryFormulas.length >= MAX_FORMULAS) return prevState; + + const newFormula = createNewBuilderFormula(prevState.builder.queryFormulas); + return { ...prevState, builder: { @@ -439,6 +525,31 @@ export function QueryBuilderProvider({ [], ); + const updateSuperSetQueryBuilderData = useCallback( + (arr: IBuilderQuery[], index: number, newQueryItem: IBuilderQuery) => + arr.map((item, idx) => { + if (index === idx) { + if (!panelType) { + return newQueryItem; + } + const queryItem = item as IBuilderQuery; + const propsRequired = + panelTypeDataSourceFormValuesMap[panelType as keyof PartialPanelTypes][ + queryItem.dataSource + ].builder.queryData; + + propsRequired.push('dataSource'); + propsRequired.forEach((p: any) => { + set(queryItem, p, get(newQueryItem, p)); + }); + return queryItem; + } + + return item; + }), + [panelType], + ); + const handleSetQueryItemData = useCallback( ( index: number, @@ -452,6 +563,19 @@ export function QueryBuilderProvider({ newQueryData, ); + return { + ...prevState, + [type]: updatedQueryBuilderData, + }; + }); + // eslint-disable-next-line sonarjs/no-identical-functions + setSupersetQuery((prevState) => { + const updatedQueryBuilderData = updateQueryBuilderData( + prevState[type], + index, + newQueryData, + ); + return { ...prevState, [type]: updatedQueryBuilderData, @@ -470,6 +594,22 @@ export function QueryBuilderProvider({ newQueryData, ); + return { + ...prevState, + builder: { + ...prevState.builder, + queryData: updatedQueryBuilderData, + }, + }; + }); + // eslint-disable-next-line sonarjs/no-identical-functions + setSupersetQuery((prevState) => { + const updatedQueryBuilderData = updateSuperSetQueryBuilderData( + prevState.builder.queryData, + index, + newQueryData, + ); + return { ...prevState, builder: { @@ -479,7 +619,7 @@ export function QueryBuilderProvider({ }; }); }, - [updateQueryBuilderData], + [updateQueryBuilderData, updateSuperSetQueryBuilderData], ); const handleSetFormulaData = useCallback( (index: number, formulaData: IBuilderFormula): void => { @@ -490,6 +630,22 @@ export function QueryBuilderProvider({ formulaData, ); + return { + ...prevState, + builder: { + ...prevState.builder, + queryFormulas: updatedFormulasBuilderData, + }, + }; + }); + // eslint-disable-next-line sonarjs/no-identical-functions + setSupersetQuery((prevState) => { + const updatedFormulasBuilderData = updateQueryBuilderData( + prevState.builder.queryFormulas, + index, + formulaData, + ); + return { ...prevState, builder: { @@ -518,6 +674,7 @@ export function QueryBuilderProvider({ query: Partial, searchParams?: Record, redirectingUrl?: typeof ROUTES[keyof typeof ROUTES], + shallStringify?: boolean, ) => { const queryType = !query.queryType || !Object.values(EQueryType).includes(query.queryType) @@ -569,7 +726,12 @@ export function QueryBuilderProvider({ if (searchParams) { Object.keys(searchParams).forEach((param) => - urlQuery.set(param, JSON.stringify(searchParams[param])), + urlQuery.set( + param, + shallStringify + ? JSON.stringify(searchParams[param]) + : (searchParams[param] as string), + ), ); } @@ -657,6 +819,10 @@ export function QueryBuilderProvider({ ...prevState, unit, })); + setSupersetQuery((prevState) => ({ + ...prevState, + unit, + })); }, [setCurrentQuery], ); @@ -669,6 +835,14 @@ export function QueryBuilderProvider({ [currentQuery, queryType], ); + const superQuery: Query = useMemo( + () => ({ + ...supersetQuery, + queryType, + }), + [supersetQuery, queryType], + ); + const isEnabledQuery = useMemo(() => !!stagedQuery && !!panelType, [ stagedQuery, panelType, @@ -677,6 +851,8 @@ export function QueryBuilderProvider({ const contextValues: QueryBuilderContextType = useMemo( () => ({ currentQuery: query, + supersetQuery: superQuery, + setSupersetQuery, stagedQuery, initialDataSource, panelType, @@ -702,6 +878,7 @@ export function QueryBuilderProvider({ }), [ query, + superQuery, stagedQuery, initialDataSource, panelType, diff --git a/frontend/src/types/common/queryBuilder.ts b/frontend/src/types/common/queryBuilder.ts index 02ea8beebb33..6ba9faf3be7f 100644 --- a/frontend/src/types/common/queryBuilder.ts +++ b/frontend/src/types/common/queryBuilder.ts @@ -1,6 +1,7 @@ import { PANEL_TYPES } from 'constants/queryBuilder'; import ROUTES from 'constants/routes'; import { Format } from 'container/NewWidget/RightContainer/types'; +import { Dispatch, SetStateAction } from 'react'; import { IBuilderFormula, IBuilderQuery, @@ -187,6 +188,8 @@ export type QueryBuilderData = { export type QueryBuilderContextType = { currentQuery: Query; stagedQuery: Query | null; + supersetQuery: Query; + setSupersetQuery: Dispatch>; initialDataSource: DataSource | null; panelType: PANEL_TYPES | null; isEnabledQuery: boolean; @@ -217,6 +220,7 @@ export type QueryBuilderContextType = { query: Query, searchParams?: Record, redirectToUrl?: typeof ROUTES[keyof typeof ROUTES], + shallStringify?: boolean, ) => void; handleRunQuery: () => void; resetQuery: (newCurrentQuery?: QueryState) => void; From 25b74b48a5bbbfb8fd6f1d9b83e5a957ab7b91b7 Mon Sep 17 00:00:00 2001 From: Rajat Dabade Date: Tue, 9 Apr 2024 13:48:54 +0530 Subject: [PATCH 57/68] [Fix]: selected time in right container to be used in query-range (#4842) --- frontend/src/container/NewWidget/LeftContainer/index.tsx | 6 ++++-- frontend/src/container/NewWidget/index.tsx | 1 + frontend/src/container/NewWidget/types.ts | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/frontend/src/container/NewWidget/LeftContainer/index.tsx b/frontend/src/container/NewWidget/LeftContainer/index.tsx index 31363fc201a7..6bc429c1c7e6 100644 --- a/frontend/src/container/NewWidget/LeftContainer/index.tsx +++ b/frontend/src/container/NewWidget/LeftContainer/index.tsx @@ -25,6 +25,7 @@ function LeftContainer({ selectedTracesFields, setSelectedTracesFields, selectedWidget, + selectedTime, }: WidgetGraphProps): JSX.Element { const { stagedQuery, redirectWithQueryBuilderData } = useQueryBuilder(); const { selectedDashboard } = useDashboard(); @@ -50,7 +51,7 @@ function LeftContainer({ return { query: updatedQuery, graphType: PANEL_TYPES.LIST, - selectedTime: 'GLOBAL_TIME', + selectedTime: selectedTime.enum || 'GLOBAL_TIME', globalSelectedInterval, tableParams: { pagination: { @@ -65,12 +66,13 @@ function LeftContainer({ if (stagedQuery) { setRequestData((prev) => ({ ...prev, + selectedTime: selectedTime.enum || prev.selectedTime, graphType: getGraphType(selectedGraph || selectedWidget.panelTypes), query: stagedQuery, })); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [stagedQuery]); + }, [stagedQuery, selectedTime]); const queryResponse = useGetQueryRange( requestData, diff --git a/frontend/src/container/NewWidget/index.tsx b/frontend/src/container/NewWidget/index.tsx index 17802d46580d..91a87d05dc50 100644 --- a/frontend/src/container/NewWidget/index.tsx +++ b/frontend/src/container/NewWidget/index.tsx @@ -401,6 +401,7 @@ function NewWidget({ selectedGraph }: NewWidgetProps): JSX.Element { selectedTracesFields={selectedTracesFields} setSelectedTracesFields={setSelectedTracesFields} selectedWidget={selectedWidget} + selectedTime={selectedTime} /> )} diff --git a/frontend/src/container/NewWidget/types.ts b/frontend/src/container/NewWidget/types.ts index cf19131ea3b6..b6a86ad483ed 100644 --- a/frontend/src/container/NewWidget/types.ts +++ b/frontend/src/container/NewWidget/types.ts @@ -6,6 +6,8 @@ import { SuccessResponse } from 'types/api'; import { Widgets } from 'types/api/dashboard/getAll'; import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange'; +import { timePreferance } from './RightContainer/timeItems'; + export interface NewWidgetProps { selectedGraph: PANEL_TYPES; yAxisUnit: Widgets['yAxisUnit']; @@ -21,6 +23,7 @@ export interface WidgetGraphProps { >; selectedWidget: Widgets; selectedGraph: PANEL_TYPES; + selectedTime: timePreferance; } export type WidgetGraphContainerProps = { From 03dccb0101d15fa87250261c250794673b2e47c2 Mon Sep 17 00:00:00 2001 From: Vikrant Gupta Date: Tue, 9 Apr 2024 19:20:08 +0530 Subject: [PATCH 58/68] fix: trace page breaking (#4844) * fix: trace page breaking * fix: crash on reload * fix: hide update button for viewer role in collapsed mode --- .../ExplorerOptions.styles.scss | 4 ++-- .../ExplorerOptions/ExplorerOptions.tsx | 4 +++- .../ExplorerOptionsHideArea.tsx | 20 +++++++++++-------- frontend/src/container/NewWidget/index.tsx | 2 +- frontend/src/providers/QueryBuilder.tsx | 14 ++++++------- 5 files changed, 25 insertions(+), 19 deletions(-) diff --git a/frontend/src/container/ExplorerOptions/ExplorerOptions.styles.scss b/frontend/src/container/ExplorerOptions/ExplorerOptions.styles.scss index eb57c1e6df09..7f6ac6a4dd94 100644 --- a/frontend/src/container/ExplorerOptions/ExplorerOptions.styles.scss +++ b/frontend/src/container/ExplorerOptions/ExplorerOptions.styles.scss @@ -1,10 +1,10 @@ .hide-update { - left: calc(50% - 41px) !important; + left: calc(50% - 72px) !important; } .explorer-update { position: fixed; bottom: 24px; - left: calc(50% - 250px); + left: calc(50% - 352px); display: flex; align-items: center; gap: 12px; diff --git a/frontend/src/container/ExplorerOptions/ExplorerOptions.tsx b/frontend/src/container/ExplorerOptions/ExplorerOptions.tsx index 5c68bc8a0dca..0e9fd3704bdc 100644 --- a/frontend/src/container/ExplorerOptions/ExplorerOptions.tsx +++ b/frontend/src/container/ExplorerOptions/ExplorerOptions.tsx @@ -400,7 +400,8 @@ function ExplorerOptions({ > Add to Dashboard - +
+
)} + +
diff --git a/frontend/src/container/TracesExplorer/Controls/styles.ts b/frontend/src/container/TracesExplorer/Controls/styles.ts index d9810d1f4c09..9e205dbde79c 100644 --- a/frontend/src/container/TracesExplorer/Controls/styles.ts +++ b/frontend/src/container/TracesExplorer/Controls/styles.ts @@ -5,4 +5,5 @@ export const Container = styled.div` align-items: center; justify-content: flex-end; gap: 0.3rem; + margin: 8px 0; `; diff --git a/frontend/src/container/TracesExplorer/ListView/styles.ts b/frontend/src/container/TracesExplorer/ListView/styles.ts index 9410a9b90e43..22722763478a 100644 --- a/frontend/src/container/TracesExplorer/ListView/styles.ts +++ b/frontend/src/container/TracesExplorer/ListView/styles.ts @@ -9,7 +9,6 @@ export const tableStyles: CSSProperties = { export const Container = styled.div` display: flex; flex-direction: column; - gap: 15px; `; export const ErrorText = styled(Typography)` diff --git a/frontend/src/container/TracesExplorer/TracesView/styles.ts b/frontend/src/container/TracesExplorer/TracesView/styles.ts index f9c9a7c8ea18..5acf6309a66f 100644 --- a/frontend/src/container/TracesExplorer/TracesView/styles.ts +++ b/frontend/src/container/TracesExplorer/TracesView/styles.ts @@ -3,7 +3,6 @@ import styled from 'styled-components'; export const Container = styled.div` display: flex; flex-direction: column; - gap: 15px; `; export const ActionsContainer = styled.div` From a9464de62d52a0b753509ff31e6cd068ceadf534 Mon Sep 17 00:00:00 2001 From: Srikanth Chekuri Date: Mon, 15 Apr 2024 13:37:08 +0530 Subject: [PATCH 67/68] chore: use last 1day data for apdex latency metric meta (#4846) --- ee/query-service/app/api/api.go | 1 - ee/query-service/app/api/metrics.go | 236 ---------- ee/query-service/app/server.go | 1 - .../src/api/metrics/ApDex/getMetricMeta.ts | 6 +- frontend/src/api/metrics/getMetricName.ts | 27 -- .../src/api/metrics/getResourceAttributes.ts | 21 +- .../container/MetricsApplication/constant.ts | 4 +- .../src/container/MetricsApplication/utils.ts | 2 + .../src/hooks/useResourceAttribute/utils.ts | 20 +- frontend/src/mocks-server/handlers.ts | 4 +- .../api/metrics/getResourceAttributes.ts | 7 +- pkg/query-service/app/apdex.go | 12 - .../app/clickhouseReader/reader.go | 176 +------ pkg/query-service/app/http_handler.go | 277 ----------- .../app/metrics/query_builder.go | 443 ------------------ .../app/metrics/query_builder_test.go | 261 ----------- pkg/query-service/app/parser/metrics.go | 117 ----- pkg/query-service/app/parser_test.go | 51 -- pkg/query-service/app/server.go | 1 - pkg/query-service/interfaces/interface.go | 4 - pkg/query-service/utils/queryTemplate/vars.go | 18 - 21 files changed, 55 insertions(+), 1634 deletions(-) delete mode 100644 ee/query-service/app/api/metrics.go delete mode 100644 frontend/src/api/metrics/getMetricName.ts delete mode 100644 pkg/query-service/app/metrics/query_builder_test.go delete mode 100644 pkg/query-service/app/parser/metrics.go diff --git a/ee/query-service/app/api/api.go b/ee/query-service/app/api/api.go index 6defd8520182..418cd00cf964 100644 --- a/ee/query-service/app/api/api.go +++ b/ee/query-service/app/api/api.go @@ -152,7 +152,6 @@ func (ah *APIHandler) RegisterRoutes(router *mux.Router, am *baseapp.AuthMiddlew router.HandleFunc("/api/v1/register", am.OpenAccess(ah.registerUser)).Methods(http.MethodPost) router.HandleFunc("/api/v1/login", am.OpenAccess(ah.loginUser)).Methods(http.MethodPost) router.HandleFunc("/api/v1/traces/{traceId}", am.ViewAccess(ah.searchTraces)).Methods(http.MethodGet) - router.HandleFunc("/api/v2/metrics/query_range", am.ViewAccess(ah.queryRangeMetricsV2)).Methods(http.MethodPost) // PAT APIs router.HandleFunc("/api/v1/pats", am.AdminAccess(ah.createPAT)).Methods(http.MethodPost) diff --git a/ee/query-service/app/api/metrics.go b/ee/query-service/app/api/metrics.go deleted file mode 100644 index 7c0e320f451a..000000000000 --- a/ee/query-service/app/api/metrics.go +++ /dev/null @@ -1,236 +0,0 @@ -package api - -import ( - "bytes" - "fmt" - "net/http" - "sync" - "text/template" - "time" - - "go.signoz.io/signoz/pkg/query-service/app/metrics" - "go.signoz.io/signoz/pkg/query-service/app/parser" - "go.signoz.io/signoz/pkg/query-service/constants" - basemodel "go.signoz.io/signoz/pkg/query-service/model" - querytemplate "go.signoz.io/signoz/pkg/query-service/utils/queryTemplate" - "go.uber.org/zap" -) - -func (ah *APIHandler) queryRangeMetricsV2(w http.ResponseWriter, r *http.Request) { - if !ah.CheckFeature(basemodel.CustomMetricsFunction) { - zap.L().Info("CustomMetricsFunction feature is not enabled in this plan") - ah.APIHandler.QueryRangeMetricsV2(w, r) - return - } - metricsQueryRangeParams, apiErrorObj := parser.ParseMetricQueryRangeParams(r) - - if apiErrorObj != nil { - zap.L().Error("Error in parsing metric query params", zap.Error(apiErrorObj.Err)) - RespondError(w, apiErrorObj, nil) - return - } - - // prometheus instant query needs same timestamp - if metricsQueryRangeParams.CompositeMetricQuery.PanelType == basemodel.QUERY_VALUE && - metricsQueryRangeParams.CompositeMetricQuery.QueryType == basemodel.PROM { - metricsQueryRangeParams.Start = metricsQueryRangeParams.End - } - - // round up the end to nearest multiple - if metricsQueryRangeParams.CompositeMetricQuery.QueryType == basemodel.QUERY_BUILDER { - end := (metricsQueryRangeParams.End) / 1000 - step := metricsQueryRangeParams.Step - metricsQueryRangeParams.End = (end / step * step) * 1000 - } - - type channelResult struct { - Series []*basemodel.Series - TableName string - Err error - Name string - Query string - } - - execClickHouseQueries := func(queries map[string]string) ([]*basemodel.Series, []string, error, map[string]string) { - var seriesList []*basemodel.Series - var tableName []string - ch := make(chan channelResult, len(queries)) - var wg sync.WaitGroup - - for name, query := range queries { - wg.Add(1) - go func(name, query string) { - defer wg.Done() - seriesList, tableName, err := ah.opts.DataConnector.GetMetricResultEE(r.Context(), query) - for _, series := range seriesList { - series.QueryName = name - } - - if err != nil { - ch <- channelResult{Err: fmt.Errorf("error in query-%s: %v", name, err), Name: name, Query: query} - return - } - ch <- channelResult{Series: seriesList, TableName: tableName} - }(name, query) - } - - wg.Wait() - close(ch) - - var errs []error - errQuriesByName := make(map[string]string) - // read values from the channel - for r := range ch { - if r.Err != nil { - errs = append(errs, r.Err) - errQuriesByName[r.Name] = r.Query - continue - } - seriesList = append(seriesList, r.Series...) - tableName = append(tableName, r.TableName) - } - if len(errs) != 0 { - return nil, nil, fmt.Errorf("encountered multiple errors: %s", metrics.FormatErrs(errs, "\n")), errQuriesByName - } - return seriesList, tableName, nil, nil - } - - execPromQueries := func(metricsQueryRangeParams *basemodel.QueryRangeParamsV2) ([]*basemodel.Series, error, map[string]string) { - var seriesList []*basemodel.Series - ch := make(chan channelResult, len(metricsQueryRangeParams.CompositeMetricQuery.PromQueries)) - var wg sync.WaitGroup - - for name, query := range metricsQueryRangeParams.CompositeMetricQuery.PromQueries { - if query.Disabled { - continue - } - wg.Add(1) - go func(name string, query *basemodel.PromQuery) { - var seriesList []*basemodel.Series - defer wg.Done() - tmpl := template.New("promql-query") - tmpl, tmplErr := tmpl.Parse(query.Query) - if tmplErr != nil { - ch <- channelResult{Err: fmt.Errorf("error in parsing query-%s: %v", name, tmplErr), Name: name, Query: query.Query} - return - } - var queryBuf bytes.Buffer - tmplErr = tmpl.Execute(&queryBuf, metricsQueryRangeParams.Variables) - if tmplErr != nil { - ch <- channelResult{Err: fmt.Errorf("error in parsing query-%s: %v", name, tmplErr), Name: name, Query: query.Query} - return - } - query.Query = queryBuf.String() - queryModel := basemodel.QueryRangeParams{ - Start: time.UnixMilli(metricsQueryRangeParams.Start), - End: time.UnixMilli(metricsQueryRangeParams.End), - Step: time.Duration(metricsQueryRangeParams.Step * int64(time.Second)), - Query: query.Query, - } - promResult, _, err := ah.opts.DataConnector.GetQueryRangeResult(r.Context(), &queryModel) - if err != nil { - ch <- channelResult{Err: fmt.Errorf("error in query-%s: %v", name, err), Name: name, Query: query.Query} - return - } - matrix, _ := promResult.Matrix() - for _, v := range matrix { - var s basemodel.Series - s.QueryName = name - s.Labels = v.Metric.Copy().Map() - for _, p := range v.Floats { - s.Points = append(s.Points, basemodel.MetricPoint{Timestamp: p.T, Value: p.F}) - } - seriesList = append(seriesList, &s) - } - ch <- channelResult{Series: seriesList} - }(name, query) - } - - wg.Wait() - close(ch) - - var errs []error - errQuriesByName := make(map[string]string) - // read values from the channel - for r := range ch { - if r.Err != nil { - errs = append(errs, r.Err) - errQuriesByName[r.Name] = r.Query - continue - } - seriesList = append(seriesList, r.Series...) - } - if len(errs) != 0 { - return nil, fmt.Errorf("encountered multiple errors: %s", metrics.FormatErrs(errs, "\n")), errQuriesByName - } - return seriesList, nil, nil - } - - var seriesList []*basemodel.Series - var tableName []string - var err error - var errQuriesByName map[string]string - switch metricsQueryRangeParams.CompositeMetricQuery.QueryType { - case basemodel.QUERY_BUILDER: - runQueries := metrics.PrepareBuilderMetricQueries(metricsQueryRangeParams, constants.SIGNOZ_TIMESERIES_TABLENAME) - if runQueries.Err != nil { - RespondError(w, &basemodel.ApiError{Typ: basemodel.ErrorBadData, Err: runQueries.Err}, nil) - return - } - seriesList, tableName, err, errQuriesByName = execClickHouseQueries(runQueries.Queries) - - case basemodel.CLICKHOUSE: - queries := make(map[string]string) - - for name, chQuery := range metricsQueryRangeParams.CompositeMetricQuery.ClickHouseQueries { - if chQuery.Disabled { - continue - } - tmpl := template.New("clickhouse-query") - tmpl, err := tmpl.Parse(chQuery.Query) - if err != nil { - RespondError(w, &basemodel.ApiError{Typ: basemodel.ErrorBadData, Err: err}, nil) - return - } - var query bytes.Buffer - - // replace go template variables - querytemplate.AssignReservedVars(metricsQueryRangeParams) - - err = tmpl.Execute(&query, metricsQueryRangeParams.Variables) - if err != nil { - RespondError(w, &basemodel.ApiError{Typ: basemodel.ErrorBadData, Err: err}, nil) - return - } - queries[name] = query.String() - } - seriesList, tableName, err, errQuriesByName = execClickHouseQueries(queries) - case basemodel.PROM: - seriesList, err, errQuriesByName = execPromQueries(metricsQueryRangeParams) - default: - err = fmt.Errorf("invalid query type") - RespondError(w, &basemodel.ApiError{Typ: basemodel.ErrorBadData, Err: err}, errQuriesByName) - return - } - - if err != nil { - apiErrObj := &basemodel.ApiError{Typ: basemodel.ErrorBadData, Err: err} - RespondError(w, apiErrObj, errQuriesByName) - return - } - if metricsQueryRangeParams.CompositeMetricQuery.PanelType == basemodel.QUERY_VALUE && - len(seriesList) > 1 && - (metricsQueryRangeParams.CompositeMetricQuery.QueryType == basemodel.QUERY_BUILDER || - metricsQueryRangeParams.CompositeMetricQuery.QueryType == basemodel.CLICKHOUSE) { - RespondError(w, &basemodel.ApiError{Typ: basemodel.ErrorBadData, Err: fmt.Errorf("invalid: query resulted in more than one series for value type")}, nil) - return - } - - type ResponseFormat struct { - ResultType string `json:"resultType"` - Result []*basemodel.Series `json:"result"` - TableName []string `json:"tableName"` - } - resp := ResponseFormat{ResultType: "matrix", Result: seriesList, TableName: tableName} - ah.Respond(w, resp) -} diff --git a/ee/query-service/app/server.go b/ee/query-service/app/server.go index dcb5568c047b..53b9a27314bb 100644 --- a/ee/query-service/app/server.go +++ b/ee/query-service/app/server.go @@ -329,7 +329,6 @@ func (s *Server) createPublicServer(apiHandler *api.APIHandler) (*http.Server, e r.Use(loggingMiddleware) apiHandler.RegisterRoutes(r, am) - apiHandler.RegisterMetricsRoutes(r, am) apiHandler.RegisterLogsRoutes(r, am) apiHandler.RegisterIntegrationRoutes(r, am) apiHandler.RegisterQueryRangeV3Routes(r, am) diff --git a/frontend/src/api/metrics/ApDex/getMetricMeta.ts b/frontend/src/api/metrics/ApDex/getMetricMeta.ts index e3045730a73c..90baa61cd81a 100644 --- a/frontend/src/api/metrics/ApDex/getMetricMeta.ts +++ b/frontend/src/api/metrics/ApDex/getMetricMeta.ts @@ -1,4 +1,4 @@ -import axios from 'api'; +import { ApiV4Instance } from 'api'; import { AxiosResponse } from 'axios'; import { MetricMetaProps } from 'types/api/metrics/getApDex'; @@ -6,4 +6,6 @@ export const getMetricMeta = ( metricName: string, servicename: string, ): Promise> => - axios.get(`/metric_meta?metricName=${metricName}&serviceName=${servicename}`); + ApiV4Instance.get( + `/metric/metric_metadata?metricName=${metricName}&serviceName=${servicename}`, + ); diff --git a/frontend/src/api/metrics/getMetricName.ts b/frontend/src/api/metrics/getMetricName.ts deleted file mode 100644 index f3bff5a921ea..000000000000 --- a/frontend/src/api/metrics/getMetricName.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ApiV2Instance as axios } from 'api'; -import { ErrorResponseHandler } from 'api/ErrorResponseHandler'; -import { AxiosError } from 'axios'; -import { ErrorResponse, SuccessResponse } from 'types/api'; -import { - MetricNameProps, - MetricNamesPayloadProps, -} from 'types/api/metrics/getMetricName'; - -export const getMetricName = async ( - props: MetricNameProps, -): Promise | ErrorResponse> => { - try { - const response = await axios.get( - `/metrics/autocomplete/list?match=${props || ''}`, - ); - - return { - statusCode: 200, - error: null, - message: response.data.status, - payload: response.data, - }; - } catch (error) { - return ErrorResponseHandler(error as AxiosError); - } -}; diff --git a/frontend/src/api/metrics/getResourceAttributes.ts b/frontend/src/api/metrics/getResourceAttributes.ts index 66524bf8f788..c482f863aedc 100644 --- a/frontend/src/api/metrics/getResourceAttributes.ts +++ b/frontend/src/api/metrics/getResourceAttributes.ts @@ -1,6 +1,7 @@ -import { ApiV2Instance as axios } from 'api'; +import { ApiV3Instance as axios } from 'api'; import { ErrorResponseHandler } from 'api/ErrorResponseHandler'; import { AxiosError } from 'axios'; +import createQueryParams from 'lib/createQueryParams'; import { ErrorResponse, SuccessResponse } from 'types/api'; import { TagKeyProps, @@ -8,15 +9,19 @@ import { TagValueProps, TagValuesPayloadProps, } from 'types/api/metrics/getResourceAttributes'; +import { DataSource, MetricAggregateOperator } from 'types/common/queryBuilder'; export const getResourceAttributesTagKeys = async ( props: TagKeyProps, ): Promise | ErrorResponse> => { try { const response = await axios.get( - `/metrics/autocomplete/tagKey?metricName=${props.metricName}${ - props.match ? `&match=${props.match}` : '' - }`, + `/autocomplete/attribute_keys?${createQueryParams({ + aggregateOperator: MetricAggregateOperator.RATE, + searchText: props.match, + dataSource: DataSource.METRICS, + aggregateAttribute: props.metricName, + })}`, ); return { @@ -35,7 +40,13 @@ export const getResourceAttributesTagValues = async ( ): Promise | ErrorResponse> => { try { const response = await axios.get( - `/metrics/autocomplete/tagValue?metricName=${props.metricName}&tagKey=${props.tagKey}`, + `/autocomplete/attribute_values?${createQueryParams({ + aggregateOperator: MetricAggregateOperator.RATE, + dataSource: DataSource.METRICS, + aggregateAttribute: props.metricName, + attributeKey: props.tagKey, + searchText: '', + })}`, ); return { diff --git a/frontend/src/container/MetricsApplication/constant.ts b/frontend/src/container/MetricsApplication/constant.ts index 1e2958a62826..9c039292bd0c 100644 --- a/frontend/src/container/MetricsApplication/constant.ts +++ b/frontend/src/container/MetricsApplication/constant.ts @@ -1,3 +1,5 @@ +/* eslint-disable sonarjs/no-duplicate-string */ + import { DownloadOptions } from 'container/Download/Download.types'; import { MenuItemKeys } from 'container/GridCardLayout/WidgetHeader/contants'; @@ -20,7 +22,7 @@ export enum FORMULA { ERROR_PERCENTAGE = 'A*100/B', DATABASE_CALLS_AVG_DURATION = 'A/B', APDEX_TRACES = '((B + C)/2)/A', - APDEX_DELTA_SPAN_METRICS = '(B + C/2)/A', + APDEX_DELTA_SPAN_METRICS = '((B + C)/2)/A', APDEX_CUMULATIVE_SPAN_METRICS = '((B + C)/2)/A', } diff --git a/frontend/src/container/MetricsApplication/utils.ts b/frontend/src/container/MetricsApplication/utils.ts index 0fdf307aceff..290b9a617920 100644 --- a/frontend/src/container/MetricsApplication/utils.ts +++ b/frontend/src/container/MetricsApplication/utils.ts @@ -33,6 +33,8 @@ export const getNearestHighestBucketValue = ( value: number, buckets: number[], ): string => { + // sort the buckets + buckets.sort((a, b) => a - b); const nearestBucket = buckets.find((bucket) => bucket >= value); return nearestBucket?.toString() || '+Inf'; }; diff --git a/frontend/src/hooks/useResourceAttribute/utils.ts b/frontend/src/hooks/useResourceAttribute/utils.ts index 52dc85c1c463..ca70e8bd5c0e 100644 --- a/frontend/src/hooks/useResourceAttribute/utils.ts +++ b/frontend/src/hooks/useResourceAttribute/utils.ts @@ -109,7 +109,11 @@ export const GetTagKeys = async (): Promise => { if (!payload || !payload?.data) { return []; } - return payload.data + + const keys = + payload.data.attributeKeys?.map((attributeKey) => attributeKey.key) || []; + + return keys .filter((tagKey: string) => tagKey !== 'resource_deployment_environment') .map((tagKey: string) => ({ label: convertMetricKeyToTrace(tagKey), @@ -125,7 +129,9 @@ export const getEnvironmentTagKeys = async (): Promise => { if (!payload || !payload?.data) { return []; } - return payload.data.map((tagKey: string) => ({ + const keys = + payload.data.attributeKeys?.map((attributeKey) => attributeKey.key) || []; + return keys.map((tagKey: string) => ({ label: convertMetricKeyToTrace(tagKey), value: tagKey, })); @@ -140,7 +146,10 @@ export const getEnvironmentTagValues = async (): Promise => { if (!payload || !payload?.data) { return []; } - return payload.data.map((tagValue: string) => ({ + + const values = payload.data.stringAttributeValues || []; + + return values.map((tagValue: string) => ({ label: tagValue, value: tagValue, })); @@ -155,7 +164,10 @@ export const GetTagValues = async (tagKey: string): Promise => { if (!payload || !payload?.data) { return []; } - return payload.data.map((tagValue: string) => ({ + + const values = payload.data.stringAttributeValues || []; + + return values.map((tagValue: string) => ({ label: tagValue, value: tagValue, })); diff --git a/frontend/src/mocks-server/handlers.ts b/frontend/src/mocks-server/handlers.ts index af25738aa7a6..445c4d835479 100644 --- a/frontend/src/mocks-server/handlers.ts +++ b/frontend/src/mocks-server/handlers.ts @@ -26,7 +26,7 @@ export const handlers = [ ), rest.get( - 'http://localhost/api/v2/metrics/autocomplete/tagKey', + 'http://localhost/api/v3/autocomplete/attribute_keys', (req, res, ctx) => { const metricName = req.url.searchParams.get('metricName'); const match = req.url.searchParams.get('match'); @@ -43,7 +43,7 @@ export const handlers = [ ), rest.get( - 'http://localhost/api/v2/metrics/autocomplete/tagValue', + 'http://localhost/api/v3/autocomplete/attribute_values', (req, res, ctx) => { // ?metricName=signoz_calls_total&tagKey=resource_signoz_collector_id const metricName = req.url.searchParams.get('metricName'); diff --git a/frontend/src/types/api/metrics/getResourceAttributes.ts b/frontend/src/types/api/metrics/getResourceAttributes.ts index 8183cfbe2a54..949436649efa 100644 --- a/frontend/src/types/api/metrics/getResourceAttributes.ts +++ b/frontend/src/types/api/metrics/getResourceAttributes.ts @@ -1,9 +1,12 @@ +import { IAttributeValuesResponse } from '../queryBuilder/getAttributesValues'; +import { IQueryAutocompleteResponse } from '../queryBuilder/queryAutocompleteResponse'; + export type TagKeyProps = { match?: string; metricName: string; }; export type TagKeysPayloadProps = { - data: string[]; + data: IQueryAutocompleteResponse; }; export type TagValueProps = { @@ -11,5 +14,5 @@ export type TagValueProps = { metricName: string; }; export type TagValuesPayloadProps = { - data: string[]; + data: IAttributeValuesResponse; }; diff --git a/pkg/query-service/app/apdex.go b/pkg/query-service/app/apdex.go index e3498d9c802f..83d76be181d2 100644 --- a/pkg/query-service/app/apdex.go +++ b/pkg/query-service/app/apdex.go @@ -33,15 +33,3 @@ func (aH *APIHandler) getApdexSettings(w http.ResponseWriter, r *http.Request) { aH.WriteJSON(w, r, apdexSet) } - -func (aH *APIHandler) getLatencyMetricMetadata(w http.ResponseWriter, r *http.Request) { - metricName := r.URL.Query().Get("metricName") - serviceName := r.URL.Query().Get("serviceName") - metricMetadata, err := aH.reader.GetLatencyMetricMetadata(r.Context(), metricName, serviceName, aH.preferDelta) - if err != nil { - RespondError(w, &model.ApiError{Err: err, Typ: model.ErrorInternal}, nil) - return - } - - aH.WriteJSON(w, r, metricMetadata) -} diff --git a/pkg/query-service/app/clickhouseReader/reader.go b/pkg/query-service/app/clickhouseReader/reader.go index bae53542446f..ff5d7548434c 100644 --- a/pkg/query-service/app/clickhouseReader/reader.go +++ b/pkg/query-service/app/clickhouseReader/reader.go @@ -3071,117 +3071,6 @@ func (r *ClickHouseReader) getPrevErrorID(ctx context.Context, queryParams *mode } } -func (r *ClickHouseReader) GetMetricAutocompleteTagKey(ctx context.Context, params *model.MetricAutocompleteTagParams) (*[]string, *model.ApiError) { - - var query string - var err error - var tagKeyList []string - var rows driver.Rows - - tagsWhereClause := "" - - for key, val := range params.MetricTags { - tagsWhereClause += fmt.Sprintf(" AND JSONExtractString(labels, '%s') = '%s' ", key, val) - } - // "select distinctTagKeys from (SELECT DISTINCT arrayJoin(tagKeys) distinctTagKeys from (SELECT DISTINCT(JSONExtractKeys(labels)) tagKeys from signoz_metrics.time_series WHERE JSONExtractString(labels,'__name__')='node_udp_queues')) WHERE distinctTagKeys ILIKE '%host%';" - if len(params.Match) != 0 { - query = fmt.Sprintf("select distinctTagKeys from (SELECT DISTINCT arrayJoin(tagKeys) distinctTagKeys from (SELECT DISTINCT(JSONExtractKeys(labels)) tagKeys from %s.%s WHERE metric_name=$1 %s)) WHERE distinctTagKeys ILIKE $2;", signozMetricDBName, signozTSTableName, tagsWhereClause) - - rows, err = r.db.Query(ctx, query, params.MetricName, fmt.Sprintf("%%%s%%", params.Match)) - - } else { - query = fmt.Sprintf("select distinctTagKeys from (SELECT DISTINCT arrayJoin(tagKeys) distinctTagKeys from (SELECT DISTINCT(JSONExtractKeys(labels)) tagKeys from %s.%s WHERE metric_name=$1 %s ));", signozMetricDBName, signozTSTableName, tagsWhereClause) - - rows, err = r.db.Query(ctx, query, params.MetricName) - } - - if err != nil { - zap.L().Error("Error in processing sql query", zap.Error(err)) - return nil, &model.ApiError{Typ: model.ErrorExec, Err: err} - } - - defer rows.Close() - var tagKey string - for rows.Next() { - if err := rows.Scan(&tagKey); err != nil { - return nil, &model.ApiError{Typ: model.ErrorExec, Err: err} - } - tagKeyList = append(tagKeyList, tagKey) - } - return &tagKeyList, nil -} - -func (r *ClickHouseReader) GetMetricAutocompleteTagValue(ctx context.Context, params *model.MetricAutocompleteTagParams) (*[]string, *model.ApiError) { - - var query string - var err error - var tagValueList []string - var rows driver.Rows - tagsWhereClause := "" - - for key, val := range params.MetricTags { - tagsWhereClause += fmt.Sprintf(" AND JSONExtractString(labels, '%s') = '%s' ", key, val) - } - - if len(params.Match) != 0 { - query = fmt.Sprintf("SELECT DISTINCT(JSONExtractString(labels, '%s')) from %s.%s WHERE metric_name=$1 %s AND JSONExtractString(labels, '%s') ILIKE $2;", params.TagKey, signozMetricDBName, signozTSTableName, tagsWhereClause, params.TagKey) - - rows, err = r.db.Query(ctx, query, params.TagKey, params.MetricName, fmt.Sprintf("%%%s%%", params.Match)) - - } else { - query = fmt.Sprintf("SELECT DISTINCT(JSONExtractString(labels, '%s')) FROM %s.%s WHERE metric_name=$2 %s;", params.TagKey, signozMetricDBName, signozTSTableName, tagsWhereClause) - rows, err = r.db.Query(ctx, query, params.TagKey, params.MetricName) - - } - - if err != nil { - zap.L().Error("Error in processing sql query", zap.Error(err)) - return nil, &model.ApiError{Typ: model.ErrorExec, Err: err} - } - - defer rows.Close() - var tagValue string - for rows.Next() { - if err := rows.Scan(&tagValue); err != nil { - return nil, &model.ApiError{Typ: model.ErrorExec, Err: err} - } - tagValueList = append(tagValueList, tagValue) - } - - return &tagValueList, nil -} - -func (r *ClickHouseReader) GetMetricAutocompleteMetricNames(ctx context.Context, matchText string, limit int) (*[]string, *model.ApiError) { - - var query string - var err error - var metricNameList []string - var rows driver.Rows - - query = fmt.Sprintf("SELECT DISTINCT(metric_name) from %s.%s WHERE metric_name ILIKE $1", signozMetricDBName, signozTSTableName) - if limit != 0 { - query = query + fmt.Sprintf(" LIMIT %d;", limit) - } - rows, err = r.db.Query(ctx, query, fmt.Sprintf("%%%s%%", matchText)) - - if err != nil { - zap.L().Error("Error in processing sql query", zap.Error(err)) - return nil, &model.ApiError{Typ: model.ErrorExec, Err: err} - } - - defer rows.Close() - var metricName string - for rows.Next() { - if err := rows.Scan(&metricName); err != nil { - return nil, &model.ApiError{Typ: model.ErrorExec, Err: err} - } - metricNameList = append(metricNameList, metricName) - } - - return &metricNameList, nil - -} - func (r *ClickHouseReader) GetMetricResultEE(ctx context.Context, query string) ([]*model.Series, string, error) { zap.L().Error("GetMetricResultEE is not implemented for opensource version") return nil, "", fmt.Errorf("GetMetricResultEE is not implemented for opensource version") @@ -4165,66 +4054,15 @@ func (r *ClickHouseReader) GetMetricAttributeValues(ctx context.Context, req *v3 return &attributeValues, nil } -func (r *ClickHouseReader) GetLatencyMetricMetadata(ctx context.Context, metricName, serviceName string, preferDelta bool) (*v3.LatencyMetricMetadataResponse, error) { - query := fmt.Sprintf("SELECT DISTINCT(temporality) from %s.%s WHERE metric_name='%s' AND JSONExtractString(labels, 'service_name') = '%s'", signozMetricDBName, signozTSTableName, metricName, serviceName) - rows, err := r.db.Query(ctx, query, metricName) - if err != nil { - zap.L().Error("Error while executing query", zap.Error(err)) - return nil, fmt.Errorf("error while executing query: %s", err.Error()) - } - defer rows.Close() - - var deltaExists bool - for rows.Next() { - var temporality string - if err := rows.Scan(&temporality); err != nil { - return nil, fmt.Errorf("error while scanning rows: %s", err.Error()) - } - if temporality == string(v3.Delta) { - deltaExists = true - } - } - - query = fmt.Sprintf("SELECT DISTINCT(JSONExtractString(labels, 'le')) as le from %s.%s WHERE metric_name='%s' AND JSONExtractString(labels, 'service_name') = '%s' ORDER BY le", signozMetricDBName, signozTSTableName, metricName, serviceName) - rows, err = r.db.Query(ctx, query, metricName) - if err != nil { - zap.L().Error("Error while executing query", zap.Error(err)) - return nil, fmt.Errorf("error while executing query: %s", err.Error()) - } - defer rows.Close() - - var leFloat64 []float64 - for rows.Next() { - var leStr string - if err := rows.Scan(&leStr); err != nil { - return nil, fmt.Errorf("error while scanning rows: %s", err.Error()) - } - le, err := strconv.ParseFloat(leStr, 64) - // ignore the error and continue if the value is not a float - // ideally this should not happen but we have seen ClickHouse - // returning empty string for some values - if err != nil { - zap.L().Error("error while parsing le value", zap.Error(err)) - continue - } - if math.IsInf(le, 0) { - continue - } - leFloat64 = append(leFloat64, le) - } - - return &v3.LatencyMetricMetadataResponse{ - Delta: deltaExists && preferDelta, - Le: leFloat64, - }, nil -} - func (r *ClickHouseReader) GetMetricMetadata(ctx context.Context, metricName, serviceName string) (*v3.MetricMetadataResponse, error) { + + unixMilli := common.PastDayRoundOff() + // Note: metric metadata should be accessible regardless of the time range selection // our standard retention period is 30 days, so we are querying the table v4_1_day to reduce the // amount of data scanned - query := fmt.Sprintf("SELECT DISTINCT temporality, description, type, unit, is_monotonic from %s.%s WHERE metric_name=$1", signozMetricDBName, signozTSTableNameV41Day) - rows, err := r.db.Query(ctx, query, metricName) + query := fmt.Sprintf("SELECT temporality, description, type, unit, is_monotonic from %s.%s WHERE metric_name=$1 AND unix_milli >= $2 GROUP BY temporality, description, type, unit, is_monotonic", signozMetricDBName, signozTSTableNameV41Day) + rows, err := r.db.Query(ctx, query, metricName, unixMilli) if err != nil { zap.L().Error("Error while fetching metric metadata", zap.Error(err)) return nil, fmt.Errorf("error while fetching metric metadata: %s", err.Error()) @@ -4242,8 +4080,8 @@ func (r *ClickHouseReader) GetMetricMetadata(ctx context.Context, metricName, se } } - query = fmt.Sprintf("SELECT DISTINCT(JSONExtractString(labels, 'le')) as le from %s.%s WHERE metric_name=$1 AND type = 'Histogram' AND JSONExtractString(labels, 'service_name') = $2 ORDER BY le", signozMetricDBName, signozTSTableNameV41Day) - rows, err = r.db.Query(ctx, query, metricName, serviceName) + query = fmt.Sprintf("SELECT JSONExtractString(labels, 'le') as le from %s.%s WHERE metric_name=$1 AND unix_milli >= $2 AND type = 'Histogram' AND JSONExtractString(labels, 'service_name') = $3 GROUP BY le ORDER BY le", signozMetricDBName, signozTSTableNameV41Day) + rows, err = r.db.Query(ctx, query, metricName, unixMilli, serviceName) if err != nil { zap.L().Error("Error while executing query", zap.Error(err)) return nil, fmt.Errorf("error while executing query: %s", err.Error()) diff --git a/pkg/query-service/app/http_handler.go b/pkg/query-service/app/http_handler.go index 9244700af063..c7adc9541657 100644 --- a/pkg/query-service/app/http_handler.go +++ b/pkg/query-service/app/http_handler.go @@ -30,7 +30,6 @@ import ( logsv3 "go.signoz.io/signoz/pkg/query-service/app/logs/v3" "go.signoz.io/signoz/pkg/query-service/app/metrics" metricsv3 "go.signoz.io/signoz/pkg/query-service/app/metrics/v3" - "go.signoz.io/signoz/pkg/query-service/app/parser" "go.signoz.io/signoz/pkg/query-service/app/querier" querierV2 "go.signoz.io/signoz/pkg/query-service/app/querier/v2" "go.signoz.io/signoz/pkg/query-service/app/queryBuilder" @@ -39,7 +38,6 @@ import ( "go.signoz.io/signoz/pkg/query-service/cache" "go.signoz.io/signoz/pkg/query-service/constants" v3 "go.signoz.io/signoz/pkg/query-service/model/v3" - querytemplate "go.signoz.io/signoz/pkg/query-service/utils/queryTemplate" "go.uber.org/multierr" "go.uber.org/zap" @@ -326,14 +324,6 @@ func writeHttpResponse(w http.ResponseWriter, data interface{}) { } } -func (aH *APIHandler) RegisterMetricsRoutes(router *mux.Router, am *AuthMiddleware) { - subRouter := router.PathPrefix("/api/v2/metrics").Subrouter() - subRouter.HandleFunc("/query_range", am.ViewAccess(aH.QueryRangeMetricsV2)).Methods(http.MethodPost) - subRouter.HandleFunc("/autocomplete/list", am.ViewAccess(aH.metricAutocompleteMetricName)).Methods(http.MethodGet) - subRouter.HandleFunc("/autocomplete/tagKey", am.ViewAccess(aH.metricAutocompleteTagKey)).Methods(http.MethodGet) - subRouter.HandleFunc("/autocomplete/tagValue", am.ViewAccess(aH.metricAutocompleteTagValue)).Methods(http.MethodGet) -} - func (aH *APIHandler) RegisterQueryRangeV3Routes(router *mux.Router, am *AuthMiddleware) { subRouter := router.PathPrefix("/api/v3").Subrouter() subRouter.HandleFunc("/autocomplete/aggregate_attributes", am.ViewAccess( @@ -419,8 +409,6 @@ func (aH *APIHandler) RegisterRoutes(router *mux.Router, am *AuthMiddleware) { router.HandleFunc("/api/v1/settings/ingestion_key", am.AdminAccess(aH.insertIngestionKey)).Methods(http.MethodPost) router.HandleFunc("/api/v1/settings/ingestion_key", am.ViewAccess(aH.getIngestionKeys)).Methods(http.MethodGet) - router.HandleFunc("/api/v1/metric_meta", am.ViewAccess(aH.getLatencyMetricMetadata)).Methods(http.MethodGet) - router.HandleFunc("/api/v1/version", am.OpenAccess(aH.getVersion)).Methods(http.MethodGet) router.HandleFunc("/api/v1/featureFlags", am.OpenAccess(aH.getFeatureFlags)).Methods(http.MethodGet) router.HandleFunc("/api/v1/configs", am.OpenAccess(aH.getConfigs)).Methods(http.MethodGet) @@ -495,62 +483,6 @@ func (aH *APIHandler) getRule(w http.ResponseWriter, r *http.Request) { aH.Respond(w, ruleResponse) } -func (aH *APIHandler) metricAutocompleteMetricName(w http.ResponseWriter, r *http.Request) { - matchText := r.URL.Query().Get("match") - limit, err := strconv.Atoi(r.URL.Query().Get("limit")) - if err != nil { - limit = 0 // no limit - } - - metricNameList, apiErrObj := aH.reader.GetMetricAutocompleteMetricNames(r.Context(), matchText, limit) - - if apiErrObj != nil { - RespondError(w, apiErrObj, nil) - return - } - aH.Respond(w, metricNameList) - -} - -func (aH *APIHandler) metricAutocompleteTagKey(w http.ResponseWriter, r *http.Request) { - metricsAutocompleteTagKeyParams, apiErrorObj := parser.ParseMetricAutocompleteTagParams(r) - if apiErrorObj != nil { - RespondError(w, apiErrorObj, nil) - return - } - - tagKeyList, apiErrObj := aH.reader.GetMetricAutocompleteTagKey(r.Context(), metricsAutocompleteTagKeyParams) - - if apiErrObj != nil { - RespondError(w, apiErrObj, nil) - return - } - aH.Respond(w, tagKeyList) -} - -func (aH *APIHandler) metricAutocompleteTagValue(w http.ResponseWriter, r *http.Request) { - metricsAutocompleteTagValueParams, apiErrorObj := parser.ParseMetricAutocompleteTagParams(r) - - if len(metricsAutocompleteTagValueParams.TagKey) == 0 { - apiErrObj := &model.ApiError{Typ: model.ErrorBadData, Err: fmt.Errorf("tagKey not present in params")} - RespondError(w, apiErrObj, nil) - return - } - if apiErrorObj != nil { - RespondError(w, apiErrorObj, nil) - return - } - - tagValueList, apiErrObj := aH.reader.GetMetricAutocompleteTagValue(r.Context(), metricsAutocompleteTagValueParams) - - if apiErrObj != nil { - RespondError(w, apiErrObj, nil) - return - } - - aH.Respond(w, tagValueList) -} - func (aH *APIHandler) addTemporality(ctx context.Context, qp *v3.QueryRangeParamsV3) error { metricNames := make([]string, 0) @@ -593,215 +525,6 @@ func (aH *APIHandler) addTemporality(ctx context.Context, qp *v3.QueryRangeParam return nil } -func (aH *APIHandler) QueryRangeMetricsV2(w http.ResponseWriter, r *http.Request) { - metricsQueryRangeParams, apiErrorObj := parser.ParseMetricQueryRangeParams(r) - - if apiErrorObj != nil { - zap.L().Error("error parsing metric query range params", zap.Error(apiErrorObj.Err)) - RespondError(w, apiErrorObj, nil) - return - } - - // prometheus instant query needs same timestamp - if metricsQueryRangeParams.CompositeMetricQuery.PanelType == model.QUERY_VALUE && - metricsQueryRangeParams.CompositeMetricQuery.QueryType == model.PROM { - metricsQueryRangeParams.Start = metricsQueryRangeParams.End - } - - // round up the end to neaerest multiple - if metricsQueryRangeParams.CompositeMetricQuery.QueryType == model.QUERY_BUILDER { - end := (metricsQueryRangeParams.End) / 1000 - step := metricsQueryRangeParams.Step - metricsQueryRangeParams.End = (end / step * step) * 1000 - } - - type channelResult struct { - Series []*model.Series - Err error - Name string - Query string - } - - execClickHouseQueries := func(queries map[string]string) ([]*model.Series, error, map[string]string) { - var seriesList []*model.Series - ch := make(chan channelResult, len(queries)) - var wg sync.WaitGroup - - for name, query := range queries { - wg.Add(1) - go func(name, query string) { - defer wg.Done() - seriesList, err := aH.reader.GetMetricResult(r.Context(), query) - for _, series := range seriesList { - series.QueryName = name - } - - if err != nil { - ch <- channelResult{Err: fmt.Errorf("error in query-%s: %v", name, err), Name: name, Query: query} - return - } - ch <- channelResult{Series: seriesList} - }(name, query) - } - - wg.Wait() - close(ch) - - var errs []error - errQuriesByName := make(map[string]string) - // read values from the channel - for r := range ch { - if r.Err != nil { - errs = append(errs, r.Err) - errQuriesByName[r.Name] = r.Query - continue - } - seriesList = append(seriesList, r.Series...) - } - if len(errs) != 0 { - return nil, fmt.Errorf("encountered multiple errors: %s", metrics.FormatErrs(errs, "\n")), errQuriesByName - } - return seriesList, nil, nil - } - - execPromQueries := func(metricsQueryRangeParams *model.QueryRangeParamsV2) ([]*model.Series, error, map[string]string) { - var seriesList []*model.Series - ch := make(chan channelResult, len(metricsQueryRangeParams.CompositeMetricQuery.PromQueries)) - var wg sync.WaitGroup - - for name, query := range metricsQueryRangeParams.CompositeMetricQuery.PromQueries { - if query.Disabled { - continue - } - wg.Add(1) - go func(name string, query *model.PromQuery) { - var seriesList []*model.Series - defer wg.Done() - tmpl := template.New("promql-query") - tmpl, tmplErr := tmpl.Parse(query.Query) - if tmplErr != nil { - ch <- channelResult{Err: fmt.Errorf("error in parsing query-%s: %v", name, tmplErr), Name: name, Query: query.Query} - return - } - var queryBuf bytes.Buffer - tmplErr = tmpl.Execute(&queryBuf, metricsQueryRangeParams.Variables) - if tmplErr != nil { - ch <- channelResult{Err: fmt.Errorf("error in parsing query-%s: %v", name, tmplErr), Name: name, Query: query.Query} - return - } - query.Query = queryBuf.String() - queryModel := model.QueryRangeParams{ - Start: time.UnixMilli(metricsQueryRangeParams.Start), - End: time.UnixMilli(metricsQueryRangeParams.End), - Step: time.Duration(metricsQueryRangeParams.Step * int64(time.Second)), - Query: query.Query, - } - promResult, _, err := aH.reader.GetQueryRangeResult(r.Context(), &queryModel) - if err != nil { - ch <- channelResult{Err: fmt.Errorf("error in query-%s: %v", name, err), Name: name, Query: query.Query} - return - } - matrix, _ := promResult.Matrix() - for _, v := range matrix { - var s model.Series - s.QueryName = name - s.Labels = v.Metric.Copy().Map() - for _, p := range v.Floats { - s.Points = append(s.Points, model.MetricPoint{Timestamp: p.T, Value: p.F}) - } - seriesList = append(seriesList, &s) - } - ch <- channelResult{Series: seriesList} - }(name, query) - } - - wg.Wait() - close(ch) - - var errs []error - errQuriesByName := make(map[string]string) - // read values from the channel - for r := range ch { - if r.Err != nil { - errs = append(errs, r.Err) - errQuriesByName[r.Name] = r.Query - continue - } - seriesList = append(seriesList, r.Series...) - } - if len(errs) != 0 { - return nil, fmt.Errorf("encountered multiple errors: %s", metrics.FormatErrs(errs, "\n")), errQuriesByName - } - return seriesList, nil, nil - } - - var seriesList []*model.Series - var err error - var errQuriesByName map[string]string - switch metricsQueryRangeParams.CompositeMetricQuery.QueryType { - case model.QUERY_BUILDER: - runQueries := metrics.PrepareBuilderMetricQueries(metricsQueryRangeParams, constants.SIGNOZ_TIMESERIES_TABLENAME) - if runQueries.Err != nil { - RespondError(w, &model.ApiError{Typ: model.ErrorBadData, Err: runQueries.Err}, nil) - return - } - seriesList, err, errQuriesByName = execClickHouseQueries(runQueries.Queries) - - case model.CLICKHOUSE: - queries := make(map[string]string) - for name, chQuery := range metricsQueryRangeParams.CompositeMetricQuery.ClickHouseQueries { - if chQuery.Disabled { - continue - } - tmpl := template.New("clickhouse-query") - tmpl, err := tmpl.Parse(chQuery.Query) - if err != nil { - RespondError(w, &model.ApiError{Typ: model.ErrorBadData, Err: err}, nil) - return - } - var query bytes.Buffer - - // replace go template variables - querytemplate.AssignReservedVars(metricsQueryRangeParams) - - err = tmpl.Execute(&query, metricsQueryRangeParams.Variables) - if err != nil { - RespondError(w, &model.ApiError{Typ: model.ErrorBadData, Err: err}, nil) - return - } - - queries[name] = query.String() - } - seriesList, err, errQuriesByName = execClickHouseQueries(queries) - case model.PROM: - seriesList, err, errQuriesByName = execPromQueries(metricsQueryRangeParams) - default: - err = fmt.Errorf("invalid query type") - RespondError(w, &model.ApiError{Typ: model.ErrorBadData, Err: err}, errQuriesByName) - return - } - - if err != nil { - apiErrObj := &model.ApiError{Typ: model.ErrorBadData, Err: err} - RespondError(w, apiErrObj, errQuriesByName) - return - } - if metricsQueryRangeParams.CompositeMetricQuery.PanelType == model.QUERY_VALUE && - len(seriesList) > 1 && - (metricsQueryRangeParams.CompositeMetricQuery.QueryType == model.QUERY_BUILDER || - metricsQueryRangeParams.CompositeMetricQuery.QueryType == model.CLICKHOUSE) { - RespondError(w, &model.ApiError{Typ: model.ErrorBadData, Err: fmt.Errorf("invalid: query resulted in more than one series for value type")}, nil) - return - } - - type ResponseFormat struct { - ResultType string `json:"resultType"` - Result []*model.Series `json:"result"` - } - resp := ResponseFormat{ResultType: "matrix", Result: seriesList} - aH.Respond(w, resp) -} - // populateTemporality same as addTemporality but for v4 and better func (aH *APIHandler) populateTemporality(ctx context.Context, qp *v3.QueryRangeParamsV3) error { diff --git a/pkg/query-service/app/metrics/query_builder.go b/pkg/query-service/app/metrics/query_builder.go index 02e0022a0e26..f6828540b28f 100644 --- a/pkg/query-service/app/metrics/query_builder.go +++ b/pkg/query-service/app/metrics/query_builder.go @@ -5,60 +5,9 @@ import ( "reflect" "strings" - "github.com/SigNoz/govaluate" - "go.signoz.io/signoz/pkg/query-service/constants" - "go.signoz.io/signoz/pkg/query-service/model" "go.uber.org/zap" ) -type RunQueries struct { - Queries map[string]string - Err error -} - -var AggregateOperatorToPercentile = map[model.AggregateOperator]float64{ - model.P05: 0.5, - model.P10: 0.10, - model.P20: 0.20, - model.P25: 0.25, - model.P50: 0.50, - model.P75: 0.75, - model.P90: 0.90, - model.P95: 0.95, - model.P99: 0.99, - model.HIST_QUANTILE_50: 0.50, - model.HIST_QUANTILE_75: 0.75, - model.HIST_QUANTILE_90: 0.90, - model.HIST_QUANTILE_95: 0.95, - model.HIST_QUANTILE_99: 0.99, -} - -var AggregateOperatorToSQLFunc = map[model.AggregateOperator]string{ - model.AVG: "avg", - model.MAX: "max", - model.MIN: "min", - model.SUM: "sum", - model.RATE_SUM: "sum", - model.RATE_AVG: "avg", - model.RATE_MAX: "max", - model.RATE_MIN: "min", -} - -// See https://github.com/SigNoz/signoz/issues/2151#issuecomment-1467249056 -var rateWithoutNegative = `if (runningDifference(value) < 0 OR runningDifference(ts) <= 0, nan, runningDifference(value)/runningDifference(ts))` - -var SupportedFunctions = []string{"exp", "log", "ln", "exp2", "log2", "exp10", "log10", "sqrt", "cbrt", "erf", "erfc", "lgamma", "tgamma", "sin", "cos", "tan", "asin", "acos", "atan", "degrees", "radians"} - -func GoValuateFuncs() map[string]govaluate.ExpressionFunction { - var GoValuateFuncs = map[string]govaluate.ExpressionFunction{} - for _, fn := range SupportedFunctions { - GoValuateFuncs[fn] = func(args ...interface{}) (interface{}, error) { - return nil, nil - } - } - return GoValuateFuncs -} - // FormattedValue formats the value to be used in clickhouse query func FormattedValue(v interface{}) string { switch x := v.(type) { @@ -97,398 +46,6 @@ func FormattedValue(v interface{}) string { } } -// BuildMetricsTimeSeriesFilterQuery builds the sub-query to be used for filtering -// timeseries based on search criteria -func BuildMetricsTimeSeriesFilterQuery(fs *model.FilterSet, groupTags []string, metricName string, aggregateOperator model.AggregateOperator) (string, error) { - var conditions []string - conditions = append(conditions, fmt.Sprintf("metric_name = %s", FormattedValue(metricName))) - if fs != nil && len(fs.Items) != 0 { - for _, item := range fs.Items { - toFormat := item.Value - op := strings.ToLower(strings.TrimSpace(item.Operator)) - // if the received value is an array for like/match op, just take the first value - if op == "like" || op == "match" || op == "nlike" || op == "nmatch" { - x, ok := item.Value.([]interface{}) - if ok { - if len(x) == 0 { - continue - } - toFormat = x[0] - } - } - fmtVal := FormattedValue(toFormat) - switch op { - case "eq": - conditions = append(conditions, fmt.Sprintf("JSONExtractString(labels, '%s') = %s", item.Key, fmtVal)) - case "neq": - conditions = append(conditions, fmt.Sprintf("JSONExtractString(labels, '%s') != %s", item.Key, fmtVal)) - case "in": - conditions = append(conditions, fmt.Sprintf("JSONExtractString(labels, '%s') IN %s", item.Key, fmtVal)) - case "nin": - conditions = append(conditions, fmt.Sprintf("JSONExtractString(labels, '%s') NOT IN %s", item.Key, fmtVal)) - case "like": - conditions = append(conditions, fmt.Sprintf("like(JSONExtractString(labels, '%s'), %s)", item.Key, fmtVal)) - case "nlike": - conditions = append(conditions, fmt.Sprintf("notLike(JSONExtractString(labels, '%s'), %s)", item.Key, fmtVal)) - case "match": - conditions = append(conditions, fmt.Sprintf("match(JSONExtractString(labels, '%s'), %s)", item.Key, fmtVal)) - case "nmatch": - conditions = append(conditions, fmt.Sprintf("not match(JSONExtractString(labels, '%s'), %s)", item.Key, fmtVal)) - default: - return "", fmt.Errorf("unsupported operation") - } - } - } - queryString := strings.Join(conditions, " AND ") - - var selectLabels string - if aggregateOperator == model.NOOP || aggregateOperator == model.RATE { - selectLabels = "labels," - } else { - for _, tag := range groupTags { - selectLabels += fmt.Sprintf(" JSONExtractString(labels, '%s') as %s,", tag, tag) - } - } - - filterSubQuery := fmt.Sprintf("SELECT %s fingerprint FROM %s.%s WHERE %s", selectLabels, constants.SIGNOZ_METRIC_DBNAME, constants.SIGNOZ_TIMESERIES_LOCAL_TABLENAME, queryString) - - return filterSubQuery, nil -} - -func BuildMetricQuery(qp *model.QueryRangeParamsV2, mq *model.MetricQuery, tableName string) (string, error) { - - if qp.CompositeMetricQuery.PanelType == model.QUERY_VALUE && len(mq.GroupingTags) != 0 { - return "", fmt.Errorf("reduce operator cannot be applied for the query") - } - - filterSubQuery, err := BuildMetricsTimeSeriesFilterQuery(mq.TagFilters, mq.GroupingTags, mq.MetricName, mq.AggregateOperator) - if err != nil { - return "", err - } - - samplesTableTimeFilter := fmt.Sprintf("metric_name = %s AND timestamp_ms >= %d AND timestamp_ms <= %d", FormattedValue(mq.MetricName), qp.Start, qp.End) - - // Select the aggregate value for interval - queryTmpl := - "SELECT %s" + - " toStartOfInterval(toDateTime(intDiv(timestamp_ms, 1000)), INTERVAL %d SECOND) as ts," + - " %s as value" + - " FROM " + constants.SIGNOZ_METRIC_DBNAME + "." + constants.SIGNOZ_SAMPLES_TABLENAME + - " INNER JOIN" + - " (%s) as filtered_time_series" + - " USING fingerprint" + - " WHERE " + samplesTableTimeFilter + - " GROUP BY %s" + - " ORDER BY %s ts" - - tagsWithoutLe := []string{} - for _, tag := range mq.GroupingTags { - if tag != "le" { - tagsWithoutLe = append(tagsWithoutLe, tag) - } - } - - groupByWithoutLe := groupBy(tagsWithoutLe...) - groupTagsWithoutLe := groupSelect(tagsWithoutLe...) - - groupBy := groupBy(mq.GroupingTags...) - groupTags := groupSelect(mq.GroupingTags...) - - switch mq.AggregateOperator { - case model.RATE: - // Calculate rate of change of metric for each unique time series - groupBy = "fingerprint, ts" - groupTags = "fingerprint," - op := "max(value)" // max value should be the closest value for point in time - subQuery := fmt.Sprintf( - queryTmpl, "any(labels) as labels, "+groupTags, qp.Step, op, filterSubQuery, groupBy, groupTags, - ) // labels will be same so any should be fine - query := `SELECT %s ts, ` + rateWithoutNegative + ` as value FROM(%s) WHERE isNaN(value) = 0` - - query = fmt.Sprintf(query, "labels as fullLabels,", subQuery) - return query, nil - case model.SUM_RATE: - rateGroupBy := "fingerprint, " + groupBy - rateGroupTags := "fingerprint, " + groupTags - op := "max(value)" - subQuery := fmt.Sprintf( - queryTmpl, rateGroupTags, qp.Step, op, filterSubQuery, rateGroupBy, rateGroupTags, - ) // labels will be same so any should be fine - query := `SELECT %s ts, ` + rateWithoutNegative + `as value FROM(%s) WHERE isNaN(value) = 0` - query = fmt.Sprintf(query, groupTags, subQuery) - query = fmt.Sprintf(`SELECT %s ts, sum(value) as value FROM (%s) GROUP BY %s ORDER BY %s ts`, groupTags, query, groupBy, groupTags) - return query, nil - case model.RATE_SUM, model.RATE_MAX, model.RATE_AVG, model.RATE_MIN: - op := fmt.Sprintf("%s(value)", AggregateOperatorToSQLFunc[mq.AggregateOperator]) - subQuery := fmt.Sprintf(queryTmpl, groupTags, qp.Step, op, filterSubQuery, groupBy, groupTags) - query := `SELECT %s ts, ` + rateWithoutNegative + `as value FROM(%s) WHERE isNaN(value) = 0` - query = fmt.Sprintf(query, groupTags, subQuery) - return query, nil - case model.P05, model.P10, model.P20, model.P25, model.P50, model.P75, model.P90, model.P95, model.P99: - op := fmt.Sprintf("quantile(%v)(value)", AggregateOperatorToPercentile[mq.AggregateOperator]) - query := fmt.Sprintf(queryTmpl, groupTags, qp.Step, op, filterSubQuery, groupBy, groupTags) - return query, nil - case model.HIST_QUANTILE_50, model.HIST_QUANTILE_75, model.HIST_QUANTILE_90, model.HIST_QUANTILE_95, model.HIST_QUANTILE_99: - rateGroupBy := "fingerprint, " + groupBy - rateGroupTags := "fingerprint, " + groupTags - op := "max(value)" - subQuery := fmt.Sprintf( - queryTmpl, rateGroupTags, qp.Step, op, filterSubQuery, rateGroupBy, rateGroupTags, - ) // labels will be same so any should be fine - query := `SELECT %s ts, ` + rateWithoutNegative + ` as value FROM(%s) WHERE isNaN(value) = 0` - query = fmt.Sprintf(query, groupTags, subQuery) - // filter out NaN values from the rate query as histogramQuantile doesn't support NaN values - query = fmt.Sprintf(`SELECT %s ts, sum(value) as value FROM (%s) GROUP BY %s HAVING isNaN(value) = 0 ORDER BY %s ts`, groupTags, query, groupBy, groupTags) - value := AggregateOperatorToPercentile[mq.AggregateOperator] - - query = fmt.Sprintf(`SELECT %s ts, histogramQuantile(arrayMap(x -> toFloat64(x), groupArray(le)), groupArray(value), %.3f) as value FROM (%s) GROUP BY %s ORDER BY %s ts`, groupTagsWithoutLe, value, query, groupByWithoutLe, groupTagsWithoutLe) - return query, nil - case model.AVG, model.SUM, model.MIN, model.MAX: - op := fmt.Sprintf("%s(value)", AggregateOperatorToSQLFunc[mq.AggregateOperator]) - query := fmt.Sprintf(queryTmpl, groupTags, qp.Step, op, filterSubQuery, groupBy, groupTags) - return query, nil - case model.COUNT: - op := "toFloat64(count(*))" - query := fmt.Sprintf(queryTmpl, groupTags, qp.Step, op, filterSubQuery, groupBy, groupTags) - return query, nil - case model.COUNT_DISTINCT: - op := "toFloat64(count(distinct(value)))" - query := fmt.Sprintf(queryTmpl, groupTags, qp.Step, op, filterSubQuery, groupBy, groupTags) - return query, nil - case model.NOOP: - queryTmpl := - "SELECT fingerprint, labels as fullLabels," + - " toStartOfInterval(toDateTime(intDiv(timestamp_ms, 1000)), INTERVAL %d SECOND) as ts," + - " any(value) as value" + - " FROM " + constants.SIGNOZ_METRIC_DBNAME + "." + constants.SIGNOZ_SAMPLES_TABLENAME + - " INNER JOIN" + - " (%s) as filtered_time_series" + - " USING fingerprint" + - " WHERE " + samplesTableTimeFilter + - " GROUP BY fingerprint, labels, ts" + - " ORDER BY fingerprint, labels, ts" - query := fmt.Sprintf(queryTmpl, qp.Step, filterSubQuery) - return query, nil - default: - return "", fmt.Errorf("unsupported aggregate operator") - } -} - -func groupBy(tags ...string) string { - tags = append(tags, "ts") - return strings.Join(tags, ",") -} - -func groupSelect(tags ...string) string { - groupTags := strings.Join(tags, ",") - if len(tags) != 0 { - groupTags += ", " - } - return groupTags -} - -// validateExpressions validates the math expressions using the list of -// allowed functions. -func validateExpressions(expressions []string, funcs map[string]govaluate.ExpressionFunction) []error { - var errs []error - for _, exp := range expressions { - _, err := govaluate.NewEvaluableExpressionWithFunctions(exp, funcs) - if err != nil { - errs = append(errs, err) - } - } - return errs -} - -// FormatErrs returns formatted error string -func FormatErrs(errs []error, separator string) string { - var errStrs []string - for _, err := range errs { - errStrs = append(errStrs, err.Error()) - } - return strings.Join(errStrs, separator) -} - -func reduceQuery(query string, reduceTo model.ReduceToOperator, aggregateOperator model.AggregateOperator) (string, error) { - var selectLabels string - var groupBy string - // NOOP and RATE can possibly return multiple time series and reduce should be applied - // for each uniques series. When the final result contains more than one series we throw - // an error post DB fetching. Otherwise just return the single data. This is not known until queried so the - // the query is prepared accordingly. - if aggregateOperator == model.NOOP || aggregateOperator == model.RATE { - selectLabels = ", any(fullLabels) as fullLabels" - groupBy = "GROUP BY fingerprint" - } - // the timestamp picked is not relevant here since the final value used is show the single - // chart with just the query value. For the quer - switch reduceTo { - case model.RLAST: - query = fmt.Sprintf("SELECT anyLast(value) as value, any(ts) as ts %s FROM (%s) %s", selectLabels, query, groupBy) - case model.RSUM: - query = fmt.Sprintf("SELECT sum(value) as value, any(ts) as ts %s FROM (%s) %s", selectLabels, query, groupBy) - case model.RAVG: - query = fmt.Sprintf("SELECT avg(value) as value, any(ts) as ts %s FROM (%s) %s", selectLabels, query, groupBy) - case model.RMAX: - query = fmt.Sprintf("SELECT max(value) as value, any(ts) as ts %s FROM (%s) %s", selectLabels, query, groupBy) - case model.RMIN: - query = fmt.Sprintf("SELECT min(value) as value, any(ts) as ts %s FROM (%s) %s", selectLabels, query, groupBy) - default: - return "", fmt.Errorf("unsupported reduce operator") - } - return query, nil -} - -// varToQuery constructs the query for each named builder block -func varToQuery(qp *model.QueryRangeParamsV2, tableName string) (map[string]string, error) { - evalFuncs := GoValuateFuncs() - varToQuery := make(map[string]string) - for _, builderQuery := range qp.CompositeMetricQuery.BuilderQueries { - // err should be nil here since the expression is already validated - expression, _ := govaluate.NewEvaluableExpressionWithFunctions(builderQuery.Expression, evalFuncs) - - // Use the parsed expression and build the query for each variable - // if not already exists - var errs []error - for _, _var := range expression.Vars() { - if _, ok := varToQuery[_var]; !ok { - mq, varExists := qp.CompositeMetricQuery.BuilderQueries[_var] - if !varExists { - errs = append(errs, fmt.Errorf("variable %s not found in builder queries", _var)) - continue - } - query, err := BuildMetricQuery(qp, mq, tableName) - if err != nil { - errs = append(errs, err) - } else { - if qp.CompositeMetricQuery.PanelType == model.QUERY_VALUE { - query, err = reduceQuery(query, mq.ReduceTo, mq.AggregateOperator) - if err != nil { - errs = append(errs, err) - } - } - } - varToQuery[_var] = query - } - } - if len(errs) != 0 { - return nil, fmt.Errorf("error while creating query: %s", FormatErrs(errs, "\n")) - } - } - return varToQuery, nil -} - -func unique(slice []string) []string { - keys := make(map[string]struct{}) - list := []string{} - for _, entry := range slice { - if _, value := keys[entry]; !value { - keys[entry] = struct{}{} - list = append(list, entry) - } - } - return list -} - -// expressionToQuery constructs the query for the expression -func expressionToQuery(qp *model.QueryRangeParamsV2, varToQuery map[string]string, expression *govaluate.EvaluableExpression) (string, error) { - var formulaQuery string - vars := unique(expression.Vars()) - for idx, var_ := range vars[1:] { - x, y := vars[idx], var_ - if !reflect.DeepEqual(qp.CompositeMetricQuery.BuilderQueries[x].GroupingTags, qp.CompositeMetricQuery.BuilderQueries[y].GroupingTags) { - return "", fmt.Errorf("group by must be same") - } - } - var modified []govaluate.ExpressionToken - tokens := expression.Tokens() - for idx := range tokens { - token := tokens[idx] - if token.Kind == govaluate.VARIABLE { - token.Value = fmt.Sprintf("%v.value", token.Value) - token.Meta = fmt.Sprintf("%v.value", token.Meta) - } - modified = append(modified, token) - } - // err should be nil here since the expression is already validated - formula, _ := govaluate.NewEvaluableExpressionFromTokens(modified) - - var formulaSubQuery string - var joinUsing string - var prevVar string - for idx, var_ := range vars { - query := varToQuery[var_] - groupTags := qp.CompositeMetricQuery.BuilderQueries[var_].GroupingTags - groupTags = append(groupTags, "ts") - if joinUsing == "" { - for _, tag := range groupTags { - joinUsing += fmt.Sprintf("%s.%s as %s, ", var_, tag, tag) - } - joinUsing = strings.TrimSuffix(joinUsing, ", ") - } - formulaSubQuery += fmt.Sprintf("(%s) as %s ", query, var_) - if idx > 0 { - formulaSubQuery += " ON " - for _, tag := range groupTags { - formulaSubQuery += fmt.Sprintf("%s.%s = %s.%s AND ", prevVar, tag, var_, tag) - } - formulaSubQuery = strings.TrimSuffix(formulaSubQuery, " AND ") - } - if idx < len(vars)-1 { - formulaSubQuery += " INNER JOIN" - } - prevVar = var_ - } - formulaQuery = fmt.Sprintf("SELECT %s, %s as value FROM ", joinUsing, formula.ExpressionString()) + formulaSubQuery - return formulaQuery, nil -} - -// PrepareBuilderMetricQueries constructs the queries to be run for query range timeseries -func PrepareBuilderMetricQueries(qp *model.QueryRangeParamsV2, tableName string) *RunQueries { - evalFuncs := GoValuateFuncs() - - // validate the expressions - var expressions []string - for _, bq := range qp.CompositeMetricQuery.BuilderQueries { - expressions = append(expressions, bq.Expression) - } - if errs := validateExpressions(expressions, evalFuncs); len(errs) != 0 { - return &RunQueries{Err: fmt.Errorf("invalid expressions: %s", FormatErrs(errs, "\n"))} - } - - varToQuery, err := varToQuery(qp, tableName) - if err != nil { - return &RunQueries{Err: err} - } - - namedQueries := make(map[string]string) - - var errs []error - for _, builderQuery := range qp.CompositeMetricQuery.BuilderQueries { - if builderQuery.Disabled { - continue - } - expression, _ := govaluate.NewEvaluableExpressionWithFunctions(builderQuery.Expression, evalFuncs) - tokens := expression.Tokens() - // expression with one token is used to represent - // that there are no functions applied on query - if len(tokens) == 1 { - _var := tokens[0].Value.(string) - namedQueries[builderQuery.QueryName] = varToQuery[_var] - } else { - query, err := expressionToQuery(qp, varToQuery, expression) - if err != nil { - errs = append(errs, err) - } - namedQueries[builderQuery.QueryName] = query - } - } - if len(errs) != 0 { - return &RunQueries{Err: fmt.Errorf("errors with formulas: %s", FormatErrs(errs, "\n"))} - } - return &RunQueries{Queries: namedQueries} -} - // PromFormattedValue formats the value to be used in promql func PromFormattedValue(v interface{}) string { switch x := v.(type) { diff --git a/pkg/query-service/app/metrics/query_builder_test.go b/pkg/query-service/app/metrics/query_builder_test.go deleted file mode 100644 index c749224689f8..000000000000 --- a/pkg/query-service/app/metrics/query_builder_test.go +++ /dev/null @@ -1,261 +0,0 @@ -package metrics - -import ( - "strings" - "testing" - - . "github.com/smartystreets/goconvey/convey" - "go.signoz.io/signoz/pkg/query-service/model" -) - -func TestBuildQuery(t *testing.T) { - Convey("TestSimpleQueryWithName", t, func() { - q := &model.QueryRangeParamsV2{ - Start: 1650991982000, - End: 1651078382000, - Step: 60, - CompositeMetricQuery: &model.CompositeMetricQuery{ - BuilderQueries: map[string]*model.MetricQuery{ - "A": { - QueryName: "A", - MetricName: "name", - AggregateOperator: model.RATE_MAX, - Expression: "A", - }, - }, - }, - } - queries := PrepareBuilderMetricQueries(q, "table").Queries - So(len(queries), ShouldEqual, 1) - So(queries["A"], ShouldContainSubstring, "WHERE metric_name = 'name'") - So(queries["A"], ShouldContainSubstring, rateWithoutNegative) - }) - - Convey("TestSimpleQueryWithHistQuantile", t, func() { - q := &model.QueryRangeParamsV2{ - Start: 1650991982000, - End: 1651078382000, - Step: 60, - CompositeMetricQuery: &model.CompositeMetricQuery{ - BuilderQueries: map[string]*model.MetricQuery{ - "A": { - QueryName: "A", - MetricName: "name", - AggregateOperator: model.HIST_QUANTILE_99, - Expression: "A", - }, - }, - }, - } - queries := PrepareBuilderMetricQueries(q, "table").Queries - So(len(queries), ShouldEqual, 1) - So(queries["A"], ShouldContainSubstring, "WHERE metric_name = 'name'") - So(queries["A"], ShouldContainSubstring, rateWithoutNegative) - So(queries["A"], ShouldContainSubstring, "HAVING isNaN(value) = 0") - }) -} - -func TestBuildQueryWithFilters(t *testing.T) { - Convey("TestBuildQueryWithFilters", t, func() { - q := &model.QueryRangeParamsV2{ - Start: 1650991982000, - End: 1651078382000, - Step: 60, - CompositeMetricQuery: &model.CompositeMetricQuery{ - BuilderQueries: map[string]*model.MetricQuery{ - "A": { - QueryName: "A", - MetricName: "name", - TagFilters: &model.FilterSet{Operator: "AND", Items: []model.FilterItem{ - {Key: "a", Value: "b", Operator: "neq"}, - {Key: "code", Value: "ERROR_*", Operator: "nmatch"}, - }}, - AggregateOperator: model.RATE_MAX, - Expression: "A", - }, - }, - }, - } - queries := PrepareBuilderMetricQueries(q, "table").Queries - So(len(queries), ShouldEqual, 1) - - So(queries["A"], ShouldContainSubstring, "WHERE metric_name = 'name' AND JSONExtractString(labels, 'a') != 'b'") - So(queries["A"], ShouldContainSubstring, rateWithoutNegative) - So(queries["A"], ShouldContainSubstring, "not match(JSONExtractString(labels, 'code'), 'ERROR_*')") - }) -} - -func TestBuildQueryWithMultipleQueries(t *testing.T) { - Convey("TestBuildQueryWithFilters", t, func() { - q := &model.QueryRangeParamsV2{ - Start: 1650991982000, - End: 1651078382000, - Step: 60, - CompositeMetricQuery: &model.CompositeMetricQuery{ - BuilderQueries: map[string]*model.MetricQuery{ - "A": { - QueryName: "A", - MetricName: "name", - TagFilters: &model.FilterSet{Operator: "AND", Items: []model.FilterItem{ - {Key: "in", Value: []interface{}{"a", "b", "c"}, Operator: "in"}, - }}, - AggregateOperator: model.RATE_AVG, - Expression: "A", - }, - "B": { - QueryName: "B", - MetricName: "name2", - AggregateOperator: model.RATE_MAX, - Expression: "B", - }, - }, - }, - } - queries := PrepareBuilderMetricQueries(q, "table").Queries - So(len(queries), ShouldEqual, 2) - So(queries["A"], ShouldContainSubstring, "WHERE metric_name = 'name' AND JSONExtractString(labels, 'in') IN ['a','b','c']") - So(queries["A"], ShouldContainSubstring, rateWithoutNegative) - }) -} - -func TestBuildQueryWithMultipleQueriesAndFormula(t *testing.T) { - Convey("TestBuildQueryWithFilters", t, func() { - q := &model.QueryRangeParamsV2{ - Start: 1650991982000, - End: 1651078382000, - Step: 60, - CompositeMetricQuery: &model.CompositeMetricQuery{ - BuilderQueries: map[string]*model.MetricQuery{ - "A": { - QueryName: "A", - MetricName: "name", - TagFilters: &model.FilterSet{Operator: "AND", Items: []model.FilterItem{ - {Key: "in", Value: []interface{}{"a", "b", "c"}, Operator: "in"}, - }}, - AggregateOperator: model.RATE_MAX, - Expression: "A", - }, - "B": { - MetricName: "name2", - AggregateOperator: model.RATE_AVG, - Expression: "B", - }, - "C": { - QueryName: "C", - Expression: "A/B", - }, - }, - }, - } - queries := PrepareBuilderMetricQueries(q, "table").Queries - So(len(queries), ShouldEqual, 3) - So(queries["C"], ShouldContainSubstring, "SELECT A.ts as ts, A.value / B.value") - So(queries["C"], ShouldContainSubstring, "WHERE metric_name = 'name' AND JSONExtractString(labels, 'in') IN ['a','b','c']") - So(queries["C"], ShouldContainSubstring, rateWithoutNegative) - }) -} - -func TestBuildQueryWithIncorrectQueryRef(t *testing.T) { - Convey("TestBuildQueryWithFilters", t, func() { - q := &model.QueryRangeParamsV2{ - Start: 1650991982000, - End: 1651078382000, - Step: 60, - CompositeMetricQuery: &model.CompositeMetricQuery{ - BuilderQueries: map[string]*model.MetricQuery{ - "A": { - QueryName: "A", - MetricName: "name", - TagFilters: &model.FilterSet{Operator: "AND", Items: []model.FilterItem{ - {Key: "in", Value: []interface{}{"a", "b", "c"}, Operator: "in"}, - }}, - AggregateOperator: model.RATE_MAX, - Expression: "A", - }, - "C": { - QueryName: "C", - Expression: "D*2", - }, - }, - }, - } - res := PrepareBuilderMetricQueries(q, "table") - So(res.Err, ShouldNotBeNil) - So(res.Err.Error(), ShouldContainSubstring, "variable D not found in builder queries") - }) -} - -func TestBuildQueryWithThreeOrMoreQueriesRefAndFormula(t *testing.T) { - Convey("TestBuildQueryWithFilters", t, func() { - q := &model.QueryRangeParamsV2{ - Start: 1650991982000, - End: 1651078382000, - Step: 60, - CompositeMetricQuery: &model.CompositeMetricQuery{ - BuilderQueries: map[string]*model.MetricQuery{ - "A": { - QueryName: "A", - MetricName: "name", - TagFilters: &model.FilterSet{Operator: "AND", Items: []model.FilterItem{ - {Key: "in", Value: []interface{}{"a", "b", "c"}, Operator: "in"}, - }}, - AggregateOperator: model.RATE_MAX, - Expression: "A", - Disabled: true, - }, - "B": { - MetricName: "name2", - AggregateOperator: model.RATE_AVG, - Expression: "B", - Disabled: true, - }, - "C": { - MetricName: "name3", - AggregateOperator: model.SUM_RATE, - Expression: "C", - Disabled: true, - }, - "F1": { - QueryName: "F1", - Expression: "A/B", - }, - "F2": { - QueryName: "F2", - Expression: "A/(B+C)", - }, - "F3": { - QueryName: "F3", - Expression: "A*A", - }, - "F4": { - QueryName: "F4", - Expression: "A*B*C", - }, - "F5": { - QueryName: "F5", - Expression: "((A - B) / B) * 100", - }, - }, - }, - } - res := PrepareBuilderMetricQueries(q, "table") - So(res.Err, ShouldBeNil) - queries := res.Queries - So(len(queries), ShouldEqual, 5) - So(queries["F1"], ShouldContainSubstring, "SELECT A.ts as ts, A.value / B.value") - So(strings.Count(queries["F1"], " ON "), ShouldEqual, 1) - - So(queries["F2"], ShouldContainSubstring, "SELECT A.ts as ts, A.value / (B.value + C.value)") - So(strings.Count(queries["F2"], " ON "), ShouldEqual, 2) - - // Working with same query multiple times should not join on itself - So(queries["F3"], ShouldNotContainSubstring, " ON ") - - So(queries["F4"], ShouldContainSubstring, "SELECT A.ts as ts, A.value * B.value * C.value") - // Number of times JOIN ON appears is N-1 where N is number of unique queries - So(strings.Count(queries["F4"], " ON "), ShouldEqual, 2) - - So(queries["F5"], ShouldContainSubstring, "SELECT A.ts as ts, ((A.value - B.value) / B.value) * 100") - So(strings.Count(queries["F5"], " ON "), ShouldEqual, 1) - }) -} diff --git a/pkg/query-service/app/parser/metrics.go b/pkg/query-service/app/parser/metrics.go deleted file mode 100644 index 3391be78c72b..000000000000 --- a/pkg/query-service/app/parser/metrics.go +++ /dev/null @@ -1,117 +0,0 @@ -package parser - -import ( - "encoding/json" - "fmt" - "net/http" - "strings" - - "go.signoz.io/signoz/pkg/query-service/app/metrics" - "go.signoz.io/signoz/pkg/query-service/model" -) - -func validateQueryRangeParamsV2(qp *model.QueryRangeParamsV2) error { - var errs []error - if !(qp.DataSource >= model.METRICS && qp.DataSource <= model.LOGS) { - errs = append(errs, fmt.Errorf("unsupported data source")) - } - if !(qp.CompositeMetricQuery.QueryType >= model.QUERY_BUILDER && qp.CompositeMetricQuery.QueryType <= model.PROM) { - errs = append(errs, fmt.Errorf("unsupported query type")) - } - if !(qp.CompositeMetricQuery.PanelType >= model.TIME_SERIES && qp.CompositeMetricQuery.PanelType <= model.QUERY_VALUE) { - errs = append(errs, fmt.Errorf("unsupported panel type")) - } - if len(errs) != 0 { - return fmt.Errorf("one or more errors found : %s", metrics.FormatErrs(errs, ",")) - } - return nil -} - -func ParseMetricQueryRangeParams(r *http.Request) (*model.QueryRangeParamsV2, *model.ApiError) { - - var postData *model.QueryRangeParamsV2 - - if err := json.NewDecoder(r.Body).Decode(&postData); err != nil { - return nil, &model.ApiError{Typ: model.ErrorBadData, Err: err} - } - if err := validateQueryRangeParamsV2(postData); err != nil { - return nil, &model.ApiError{Typ: model.ErrorBadData, Err: err} - } - // prepare the variables for the corrspnding query type - formattedVars := make(map[string]interface{}) - for name, value := range postData.Variables { - if postData.CompositeMetricQuery.QueryType == model.PROM { - formattedVars[name] = metrics.PromFormattedValue(value) - } else if postData.CompositeMetricQuery.QueryType == model.CLICKHOUSE { - formattedVars[name] = metrics.FormattedValue(value) - } - } - // replace the variables in metrics builder filter item with actual value - if postData.CompositeMetricQuery.QueryType == model.QUERY_BUILDER { - for _, query := range postData.CompositeMetricQuery.BuilderQueries { - if query.TagFilters == nil || len(query.TagFilters.Items) == 0 { - continue - } - for idx := range query.TagFilters.Items { - item := &query.TagFilters.Items[idx] - value := item.Value - if value != nil { - switch x := value.(type) { - case string: - variableName := strings.Trim(x, "{{ . }}") - if _, ok := postData.Variables[variableName]; ok { - item.Value = postData.Variables[variableName] - } - case []interface{}: - if len(x) > 0 { - switch x[0].(type) { - case string: - variableName := strings.Trim(x[0].(string), "{{ . }}") - if _, ok := postData.Variables[variableName]; ok { - item.Value = postData.Variables[variableName] - } - } - } - } - } - } - } - } - postData.Variables = formattedVars - - return postData, nil -} - -func ParseMetricAutocompleteTagParams(r *http.Request) (*model.MetricAutocompleteTagParams, *model.ApiError) { - - metricName := r.URL.Query().Get("metricName") - if len(metricName) == 0 { - err := fmt.Errorf("metricName not present in params") - return nil, &model.ApiError{Typ: model.ErrorBadData, Err: err} - } - - tagsStr := r.URL.Query().Get("tags") - - // parsing tags - var tags map[string]string - if tagsStr != "" && len(tagsStr) != 0 { - - err := json.Unmarshal([]byte(tagsStr), &tags) - if err != nil { - return nil, &model.ApiError{Typ: model.ErrorBadData, Err: fmt.Errorf("unable to parse tags in params: %v", err)} - } - } - - matchText := r.URL.Query().Get("match") - - tagKey := r.URL.Query().Get("tagKey") - - metricAutocompleteTagParams := &model.MetricAutocompleteTagParams{ - MetricName: metricName, - MetricTags: tags, - Match: matchText, - TagKey: tagKey, - } - - return metricAutocompleteTagParams, nil -} diff --git a/pkg/query-service/app/parser_test.go b/pkg/query-service/app/parser_test.go index 5b9e776486f7..f2959616a2bc 100644 --- a/pkg/query-service/app/parser_test.go +++ b/pkg/query-service/app/parser_test.go @@ -9,62 +9,11 @@ import ( "testing" "time" - "github.com/smartystreets/assertions/should" - . "github.com/smartystreets/goconvey/convey" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.signoz.io/signoz/pkg/query-service/app/metrics" - "go.signoz.io/signoz/pkg/query-service/model" v3 "go.signoz.io/signoz/pkg/query-service/model/v3" ) -func TestParseFilterSingleFilter(t *testing.T) { - Convey("TestParseFilterSingleFilter", t, func() { - postBody := []byte(`{ - "op": "AND", - "items": [ - {"key": "namespace", "value": "a", "op": "EQ"} - ] - }`) - req, _ := http.NewRequest("POST", "", bytes.NewReader(postBody)) - res, _ := parseFilterSet(req) - query, _ := metrics.BuildMetricsTimeSeriesFilterQuery(res, []string{}, "table", model.NOOP) - So(query, ShouldContainSubstring, "WHERE metric_name = 'table' AND JSONExtractString(labels, 'namespace') = 'a'") - }) -} - -func TestParseFilterMultipleFilter(t *testing.T) { - Convey("TestParseFilterMultipleFilter", t, func() { - postBody := []byte(`{ - "op": "AND", - "items": [ - {"key": "namespace", "value": "a", "op": "EQ"}, - {"key": "host", "value": ["host-1", "host-2"], "op": "IN"} - ] - }`) - req, _ := http.NewRequest("POST", "", bytes.NewReader(postBody)) - res, _ := parseFilterSet(req) - query, _ := metrics.BuildMetricsTimeSeriesFilterQuery(res, []string{}, "table", model.NOOP) - So(query, should.ContainSubstring, "JSONExtractString(labels, 'host') IN ['host-1','host-2']") - So(query, should.ContainSubstring, "JSONExtractString(labels, 'namespace') = 'a'") - }) -} - -func TestParseFilterNotSupportedOp(t *testing.T) { - Convey("TestParseFilterNotSupportedOp", t, func() { - postBody := []byte(`{ - "op": "AND", - "items": [ - {"key": "namespace", "value": "a", "op": "PO"} - ] - }`) - req, _ := http.NewRequest("POST", "", bytes.NewReader(postBody)) - res, _ := parseFilterSet(req) - _, err := metrics.BuildMetricsTimeSeriesFilterQuery(res, []string{}, "table", model.NOOP) - So(err, should.BeError, "unsupported operation") - }) -} - func TestParseAggregateAttrReques(t *testing.T) { reqCases := []struct { desc string diff --git a/pkg/query-service/app/server.go b/pkg/query-service/app/server.go index cb34b048ea03..d28fd62666aa 100644 --- a/pkg/query-service/app/server.go +++ b/pkg/query-service/app/server.go @@ -276,7 +276,6 @@ func (s *Server) createPublicServer(api *APIHandler) (*http.Server, error) { am := NewAuthMiddleware(auth.GetUserFromRequest) api.RegisterRoutes(r, am) - api.RegisterMetricsRoutes(r, am) api.RegisterLogsRoutes(r, am) api.RegisterIntegrationRoutes(r, am) api.RegisterQueryRangeV3Routes(r, am) diff --git a/pkg/query-service/interfaces/interface.go b/pkg/query-service/interfaces/interface.go index d132ad3c9c41..814f7b9071e0 100644 --- a/pkg/query-service/interfaces/interface.go +++ b/pkg/query-service/interfaces/interface.go @@ -58,9 +58,6 @@ type Reader interface { SetTTL(ctx context.Context, ttlParams *model.TTLParams) (*model.SetTTLResponseItem, *model.ApiError) FetchTemporality(ctx context.Context, metricNames []string) (map[string]map[v3.Temporality]bool, error) - GetMetricAutocompleteMetricNames(ctx context.Context, matchText string, limit int) (*[]string, *model.ApiError) - GetMetricAutocompleteTagKey(ctx context.Context, params *model.MetricAutocompleteTagParams) (*[]string, *model.ApiError) - GetMetricAutocompleteTagValue(ctx context.Context, params *model.MetricAutocompleteTagParams) (*[]string, *model.ApiError) GetMetricResult(ctx context.Context, query string) ([]*model.Series, error) GetMetricResultEE(ctx context.Context, query string) ([]*model.Series, string, error) GetMetricAggregateAttributes(ctx context.Context, req *v3.AggregateAttributeRequest) (*v3.AggregateAttributeResponse, error) @@ -106,7 +103,6 @@ type Reader interface { QueryDashboardVars(ctx context.Context, query string) (*model.DashboardVar, error) CheckClickHouse(ctx context.Context) error - GetLatencyMetricMetadata(context.Context, string, string, bool) (*v3.LatencyMetricMetadataResponse, error) GetMetricMetadata(context.Context, string, string) (*v3.MetricMetadataResponse, error) } diff --git a/pkg/query-service/utils/queryTemplate/vars.go b/pkg/query-service/utils/queryTemplate/vars.go index b63487ec4a4d..7297af6a24a3 100644 --- a/pkg/query-service/utils/queryTemplate/vars.go +++ b/pkg/query-service/utils/queryTemplate/vars.go @@ -3,27 +3,9 @@ package querytemplate import ( "fmt" - "go.signoz.io/signoz/pkg/query-service/model" v3 "go.signoz.io/signoz/pkg/query-service/model/v3" ) -// AssignReservedVars assigns values for go template vars. assumes that -// model.QueryRangeParamsV2.Start and End are Unix Nano timestamps -func AssignReservedVars(metricsQueryRangeParams *model.QueryRangeParamsV2) { - metricsQueryRangeParams.Variables["start_timestamp"] = metricsQueryRangeParams.Start / 1000 - metricsQueryRangeParams.Variables["end_timestamp"] = metricsQueryRangeParams.End / 1000 - - metricsQueryRangeParams.Variables["start_timestamp_ms"] = metricsQueryRangeParams.Start - metricsQueryRangeParams.Variables["end_timestamp_ms"] = metricsQueryRangeParams.End - - metricsQueryRangeParams.Variables["start_timestamp_nano"] = metricsQueryRangeParams.Start * 1e6 - metricsQueryRangeParams.Variables["end_timestamp_nano"] = metricsQueryRangeParams.End * 1e6 - - metricsQueryRangeParams.Variables["start_datetime"] = fmt.Sprintf("toDateTime(%d)", metricsQueryRangeParams.Start/1000) - metricsQueryRangeParams.Variables["end_datetime"] = fmt.Sprintf("toDateTime(%d)", metricsQueryRangeParams.End/1000) - -} - // AssignReservedVars assigns values for go template vars. assumes that // model.QueryRangeParamsV3.Start and End are Unix Nano timestamps func AssignReservedVarsV3(metricsQueryRangeParams *v3.QueryRangeParamsV3) { From fc2bdb610fc4c2ffea55d45a166ab748bbf47599 Mon Sep 17 00:00:00 2001 From: Srikanth Chekuri Date: Mon, 15 Apr 2024 13:46:12 +0530 Subject: [PATCH 68/68] chore: make send resolved notifs configurable (#4833) --- frontend/public/locales/en-GB/channels.json | 1 + frontend/public/locales/en/channels.json | 1 + frontend/src/api/channels/createEmail.ts | 2 +- frontend/src/api/channels/createMsTeams.ts | 2 +- frontend/src/api/channels/createPager.ts | 2 +- frontend/src/api/channels/createSlack.ts | 2 +- frontend/src/api/channels/createWebhook.ts | 2 +- frontend/src/api/channels/editEmail.ts | 2 +- frontend/src/api/channels/editMsTeams.ts | 2 +- frontend/src/api/channels/editOpsgenie.ts | 2 +- frontend/src/api/channels/editPager.ts | 2 +- frontend/src/api/channels/editSlack.ts | 2 +- frontend/src/api/channels/editWebhook.ts | 2 +- .../container/CreateAlertChannels/index.tsx | 13 +++++++------ .../src/container/EditAlertChannels/index.tsx | 6 +++--- .../src/container/FormAlertChannels/index.tsx | 18 +++++++++++++++++- 16 files changed, 40 insertions(+), 21 deletions(-) diff --git a/frontend/public/locales/en-GB/channels.json b/frontend/public/locales/en-GB/channels.json index 027501f69d43..807b7a6e3b81 100644 --- a/frontend/public/locales/en-GB/channels.json +++ b/frontend/public/locales/en-GB/channels.json @@ -15,6 +15,7 @@ "button_test_channel": "Test", "button_return": "Back", "field_channel_name": "Name", + "field_send_resolved": "Send resolved alerts", "field_channel_type": "Type", "field_webhook_url": "Webhook URL", "field_slack_recipient": "Recipient", diff --git a/frontend/public/locales/en/channels.json b/frontend/public/locales/en/channels.json index 9ab31d697cca..0d9387d3291b 100644 --- a/frontend/public/locales/en/channels.json +++ b/frontend/public/locales/en/channels.json @@ -15,6 +15,7 @@ "button_test_channel": "Test", "button_return": "Back", "field_channel_name": "Name", + "field_send_resolved": "Send resolved alerts", "field_channel_type": "Type", "field_webhook_url": "Webhook URL", "field_slack_recipient": "Recipient", diff --git a/frontend/src/api/channels/createEmail.ts b/frontend/src/api/channels/createEmail.ts index cde74b9c6d1c..7d0910d40f43 100644 --- a/frontend/src/api/channels/createEmail.ts +++ b/frontend/src/api/channels/createEmail.ts @@ -12,7 +12,7 @@ const create = async ( name: props.name, email_configs: [ { - send_resolved: true, + send_resolved: props.send_resolved, to: props.to, html: props.html, headers: props.headers, diff --git a/frontend/src/api/channels/createMsTeams.ts b/frontend/src/api/channels/createMsTeams.ts index 9e06e275a00c..ef9d309a9786 100644 --- a/frontend/src/api/channels/createMsTeams.ts +++ b/frontend/src/api/channels/createMsTeams.ts @@ -12,7 +12,7 @@ const create = async ( name: props.name, msteams_configs: [ { - send_resolved: true, + send_resolved: props.send_resolved, webhook_url: props.webhook_url, title: props.title, text: props.text, diff --git a/frontend/src/api/channels/createPager.ts b/frontend/src/api/channels/createPager.ts index 2747768cf12b..682874f7b48c 100644 --- a/frontend/src/api/channels/createPager.ts +++ b/frontend/src/api/channels/createPager.ts @@ -12,7 +12,7 @@ const create = async ( name: props.name, pagerduty_configs: [ { - send_resolved: true, + send_resolved: props.send_resolved, routing_key: props.routing_key, client: props.client, client_url: props.client_url, diff --git a/frontend/src/api/channels/createSlack.ts b/frontend/src/api/channels/createSlack.ts index f9e430fbc9c3..d68beddc9b57 100644 --- a/frontend/src/api/channels/createSlack.ts +++ b/frontend/src/api/channels/createSlack.ts @@ -12,7 +12,7 @@ const create = async ( name: props.name, slack_configs: [ { - send_resolved: true, + send_resolved: props.send_resolved, api_url: props.api_url, channel: props.channel, title: props.title, diff --git a/frontend/src/api/channels/createWebhook.ts b/frontend/src/api/channels/createWebhook.ts index 9c3c52c943b8..67a0de7a7b94 100644 --- a/frontend/src/api/channels/createWebhook.ts +++ b/frontend/src/api/channels/createWebhook.ts @@ -30,7 +30,7 @@ const create = async ( name: props.name, webhook_configs: [ { - send_resolved: true, + send_resolved: props.send_resolved, url: props.api_url, http_config: httpConfig, }, diff --git a/frontend/src/api/channels/editEmail.ts b/frontend/src/api/channels/editEmail.ts index f20e5eb8f90e..b80fe687a9a9 100644 --- a/frontend/src/api/channels/editEmail.ts +++ b/frontend/src/api/channels/editEmail.ts @@ -12,7 +12,7 @@ const editEmail = async ( name: props.name, email_configs: [ { - send_resolved: true, + send_resolved: props.send_resolved, to: props.to, html: props.html, headers: props.headers, diff --git a/frontend/src/api/channels/editMsTeams.ts b/frontend/src/api/channels/editMsTeams.ts index ee6bd309c119..293688f6c2a2 100644 --- a/frontend/src/api/channels/editMsTeams.ts +++ b/frontend/src/api/channels/editMsTeams.ts @@ -12,7 +12,7 @@ const editMsTeams = async ( name: props.name, msteams_configs: [ { - send_resolved: true, + send_resolved: props.send_resolved, webhook_url: props.webhook_url, title: props.title, text: props.text, diff --git a/frontend/src/api/channels/editOpsgenie.ts b/frontend/src/api/channels/editOpsgenie.ts index 71f830f9f867..1eb65c7adddd 100644 --- a/frontend/src/api/channels/editOpsgenie.ts +++ b/frontend/src/api/channels/editOpsgenie.ts @@ -12,7 +12,7 @@ const editOpsgenie = async ( name: props.name, opsgenie_configs: [ { - send_resolved: true, + send_resolved: props.send_resolved, api_key: props.api_key, description: props.description, priority: props.priority, diff --git a/frontend/src/api/channels/editPager.ts b/frontend/src/api/channels/editPager.ts index a31d73dcdbfa..091d42b640e5 100644 --- a/frontend/src/api/channels/editPager.ts +++ b/frontend/src/api/channels/editPager.ts @@ -12,7 +12,7 @@ const editPager = async ( name: props.name, pagerduty_configs: [ { - send_resolved: true, + send_resolved: props.send_resolved, routing_key: props.routing_key, client: props.client, client_url: props.client_url, diff --git a/frontend/src/api/channels/editSlack.ts b/frontend/src/api/channels/editSlack.ts index 9a34f41318fc..639646452cc1 100644 --- a/frontend/src/api/channels/editSlack.ts +++ b/frontend/src/api/channels/editSlack.ts @@ -12,7 +12,7 @@ const editSlack = async ( name: props.name, slack_configs: [ { - send_resolved: true, + send_resolved: props.send_resolved, api_url: props.api_url, channel: props.channel, title: props.title, diff --git a/frontend/src/api/channels/editWebhook.ts b/frontend/src/api/channels/editWebhook.ts index a574633e4e21..a96850c2db2c 100644 --- a/frontend/src/api/channels/editWebhook.ts +++ b/frontend/src/api/channels/editWebhook.ts @@ -29,7 +29,7 @@ const editWebhook = async ( name: props.name, webhook_configs: [ { - send_resolved: true, + send_resolved: props.send_resolved, url: props.api_url, http_config: httpConfig, }, diff --git a/frontend/src/container/CreateAlertChannels/index.tsx b/frontend/src/container/CreateAlertChannels/index.tsx index 51a0b6214e42..c0eec3ecdd4c 100644 --- a/frontend/src/container/CreateAlertChannels/index.tsx +++ b/frontend/src/container/CreateAlertChannels/index.tsx @@ -53,6 +53,7 @@ function CreateAlertChannels({ EmailChannel > >({ + send_resolved: true, text: `{{ range .Alerts -}} *Alert:* {{ .Labels.alertname }}{{ if .Labels.severity }} - {{ .Labels.severity }}{{ end }} @@ -119,7 +120,7 @@ function CreateAlertChannels({ api_url: selectedConfig?.api_url || '', channel: selectedConfig?.channel || '', name: selectedConfig?.name || '', - send_resolved: true, + send_resolved: selectedConfig?.send_resolved || false, text: selectedConfig?.text || '', title: selectedConfig?.title || '', }), @@ -158,7 +159,7 @@ function CreateAlertChannels({ let request: WebhookChannel = { api_url: selectedConfig?.api_url || '', name: selectedConfig?.name || '', - send_resolved: true, + send_resolved: selectedConfig?.send_resolved || false, }; if (selectedConfig?.username !== '' || selectedConfig?.password !== '') { @@ -226,7 +227,7 @@ function CreateAlertChannels({ return { name: selectedConfig?.name || '', - send_resolved: true, + send_resolved: selectedConfig?.send_resolved || false, routing_key: selectedConfig?.routing_key || '', client: selectedConfig?.client || '', client_url: selectedConfig?.client_url || '', @@ -274,7 +275,7 @@ function CreateAlertChannels({ () => ({ api_key: selectedConfig?.api_key || '', name: selectedConfig?.name || '', - send_resolved: true, + send_resolved: selectedConfig?.send_resolved || false, description: selectedConfig?.description || '', message: selectedConfig?.message || '', priority: selectedConfig?.priority || '', @@ -312,7 +313,7 @@ function CreateAlertChannels({ const prepareEmailRequest = useCallback( () => ({ name: selectedConfig?.name || '', - send_resolved: true, + send_resolved: selectedConfig?.send_resolved || false, to: selectedConfig?.to || '', html: selectedConfig?.html || '', headers: selectedConfig?.headers || {}, @@ -350,7 +351,7 @@ function CreateAlertChannels({ () => ({ webhook_url: selectedConfig?.webhook_url || '', name: selectedConfig?.name || '', - send_resolved: true, + send_resolved: selectedConfig?.send_resolved || false, text: selectedConfig?.text || '', title: selectedConfig?.title || '', }), diff --git a/frontend/src/container/EditAlertChannels/index.tsx b/frontend/src/container/EditAlertChannels/index.tsx index 29d7816d90dd..3c2e956f141a 100644 --- a/frontend/src/container/EditAlertChannels/index.tsx +++ b/frontend/src/container/EditAlertChannels/index.tsx @@ -72,7 +72,7 @@ function EditAlertChannels({ api_url: selectedConfig?.api_url || '', channel: selectedConfig?.channel || '', name: selectedConfig?.name || '', - send_resolved: true, + send_resolved: selectedConfig?.send_resolved || false, text: selectedConfig?.text || '', title: selectedConfig?.title || '', id, @@ -115,7 +115,7 @@ function EditAlertChannels({ return { api_url: selectedConfig?.api_url || '', name: name || '', - send_resolved: true, + send_resolved: selectedConfig?.send_resolved || false, username, password, id, @@ -284,7 +284,7 @@ function EditAlertChannels({ () => ({ webhook_url: selectedConfig?.webhook_url || '', name: selectedConfig?.name || '', - send_resolved: true, + send_resolved: selectedConfig?.send_resolved || false, text: selectedConfig?.text || '', title: selectedConfig?.title || '', id, diff --git a/frontend/src/container/FormAlertChannels/index.tsx b/frontend/src/container/FormAlertChannels/index.tsx index 844e86236f64..1d772ca7a85a 100644 --- a/frontend/src/container/FormAlertChannels/index.tsx +++ b/frontend/src/container/FormAlertChannels/index.tsx @@ -1,4 +1,4 @@ -import { Form, FormInstance, Input, Select, Typography } from 'antd'; +import { Form, FormInstance, Input, Select, Switch, Typography } from 'antd'; import { Store } from 'antd/lib/form/interface'; import UpgradePrompt from 'components/Upgrade/UpgradePrompt'; import { FeatureKeys } from 'constants/features'; @@ -95,6 +95,22 @@ function FormAlertChannels({ /> + + { + setSelectedConfig((state) => ({ + ...state, + send_resolved: value, + })); + }} + /> + +