diff --git a/package.json b/package.json index f90670844d..83f6b15b8c 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "js-yaml": "3.12.0", "json-beautify": "1.0.1", "lodash": "4.17.11", - "logfmt": "^1.2.1", + "logfmt": "1.2.1", "moment": "2.23.0", "patternfly": "3.59.1", "patternfly-react": "2.25.3", diff --git a/src/actions/HelpDropdownThunkActions.ts b/src/actions/HelpDropdownThunkActions.ts index 1c73f71393..776c48c5af 100644 --- a/src/actions/HelpDropdownThunkActions.ts +++ b/src/actions/HelpDropdownThunkActions.ts @@ -24,6 +24,10 @@ const HelpDropdownThunkActions = { const hasJaeger = status['data']['externalServices'].filter(item => item['name'] === 'Jaeger'); if (hasJaeger.length === 1) { dispatch(JaegerActions.setUrl(hasJaeger[0]['url'])); + // If same protocol enable integration + if (hasJaeger[0]['url'].startsWith(window.location.protocol)) { + dispatch(JaegerActions.setEnableIntegration(true)); + } } status['data']['warningMessages'].forEach(wMsg => { diff --git a/src/actions/JaegerActions.ts b/src/actions/JaegerActions.ts index 3f3c5ce420..b2af465b0d 100644 --- a/src/actions/JaegerActions.ts +++ b/src/actions/JaegerActions.ts @@ -14,6 +14,8 @@ enum JaegerActionKeys { SET_LIMIT = 'SET_LIMIT', SET_DURATIONS = 'SET_DURATIONS', + // ENABLE INTEGRAION WITH JAEGER + SET_ENABLE_INTEGRATION = 'SET_ENABLE_INTEGRATION', // RESULTS VISUALZIATION OPTIONS SET_SEARCH_GRAPH_TO_HIDE = 'SET_SEARCH_GRAPH_TO_HIDE', @@ -36,9 +38,10 @@ export const JaegerActions = { list: newList }) ), + setEnableIntegration: createStandardAction(JaegerActionKeys.SET_ENABLE_INTEGRATION)(), setService: createStandardAction(JaegerActionKeys.SET_SERVICE)(), setNamespace: createStandardAction(JaegerActionKeys.SET_NAMESPACE)(), - setLookback: createStandardAction(JaegerActionKeys.SET_LOOKBACK)(), + setLookback: createStandardAction(JaegerActionKeys.SET_LOOKBACK)(), setTags: createStandardAction(JaegerActionKeys.SET_TAGS)(), setLimit: createStandardAction(JaegerActionKeys.SET_LIMIT)(), setSearchRequest: createStandardAction(JaegerActionKeys.SET_SEARCH_REQUEST)(), diff --git a/src/actions/JaegerThunkActions.ts b/src/actions/JaegerThunkActions.ts index 187bcc1d9e..8f0b96a0bf 100644 --- a/src/actions/JaegerThunkActions.ts +++ b/src/actions/JaegerThunkActions.ts @@ -6,7 +6,7 @@ import { ServiceOverview } from '../types/ServiceList'; import { KialiAppState } from '../store/Store'; import { ThunkDispatch } from 'redux-thunk'; import { KialiAppAction } from './KialiAppAction'; -import { JAEGER_QUERY } from '../config'; +import { jaegerQuery } from '../config'; import logfmtParser from 'logfmt/lib/logfmt_parser'; import moment from 'moment'; @@ -30,7 +30,7 @@ export class JaegerURLSearch { url: string; constructor(url: string) { - this.url = `${url}${JAEGER_QUERY().PATH}?${JAEGER_QUERY().EMBED.UI_EMBED}=${JAEGER_QUERY().EMBED.VERSION}`; + this.url = `${url}${jaegerQuery().path}?${jaegerQuery().embed.uiEmbed}=${jaegerQuery().embed.version}`; } addQueryParam(param: string, value: string | number) { @@ -84,39 +84,39 @@ export const JaegerThunkActions = { getSearchURL: () => { return (dispatch: ThunkDispatch, getState: () => KialiAppState) => { const searchOptions = getState().jaegerState.search; - const jaegerOptions = JAEGER_QUERY().OPTIONS; + const jaegerOptions = jaegerQuery().options; const urlRequest = new JaegerURLSearch(getState().jaegerState.jaegerURL); // Search options - urlRequest.addQueryParam(jaegerOptions.START_TIME, searchOptions.start); - urlRequest.addQueryParam(jaegerOptions.END_TIME, searchOptions.end); - urlRequest.addQueryParam(jaegerOptions.LIMIT_TRACES, searchOptions.limit); - urlRequest.addQueryParam(jaegerOptions.LOOKBACK, searchOptions.lookback); - urlRequest.addQueryParam(jaegerOptions.MAX_DURATION, searchOptions.maxDuration); - urlRequest.addQueryParam(jaegerOptions.MIN_DURATION, searchOptions.minDuration); + urlRequest.addQueryParam(jaegerOptions.startTime, searchOptions.start); + urlRequest.addQueryParam(jaegerOptions.endTime, searchOptions.end); + urlRequest.addQueryParam(jaegerOptions.limitTraces, searchOptions.limit); + urlRequest.addQueryParam(jaegerOptions.lookback, searchOptions.lookback); + urlRequest.addQueryParam(jaegerOptions.maxDuration, searchOptions.maxDuration); + urlRequest.addQueryParam(jaegerOptions.minDuration, searchOptions.minDuration); urlRequest.addQueryParam( - jaegerOptions.SERVICE_SELECTOR, + jaegerOptions.serviceSelector, searchOptions.serviceSelected + '.' + searchOptions.namespaceSelected ); const logfmtTags = convTagsLogfmt(searchOptions.tags); if (logfmtTags) { - urlRequest.addQueryParam(jaegerOptions.TAGS, logfmtTags); + urlRequest.addQueryParam(jaegerOptions.tags, logfmtTags); } // Embed Options const traceOptions = getState().jaegerState.trace; // Rename query params for 1.9 Jaeger - urlRequest.addQueryParam(JAEGER_QUERY().EMBED.UI_TRACE_HIDE_MINIMAP, traceOptions.hideMinimap ? '1' : '0'); - urlRequest.addQueryParam(JAEGER_QUERY().EMBED.UI_SEARCH_HIDE_GRAPH, searchOptions.hideGraph ? '1' : '0'); - urlRequest.addQueryParam(JAEGER_QUERY().EMBED.UI_TRACE_HIDE_SUMMARY, traceOptions.hideSummary ? '1' : '0'); + urlRequest.addQueryParam(jaegerQuery().embed.uiTraceHideMinimap, traceOptions.hideMinimap ? '1' : '0'); + urlRequest.addQueryParam(jaegerQuery().embed.uiSearchHideGraph, searchOptions.hideGraph ? '1' : '0'); + urlRequest.addQueryParam(jaegerQuery().embed.uiTraceHideSummary, traceOptions.hideSummary ? '1' : '0'); return dispatch(JaegerActions.setSearchRequest(urlRequest.url)); }; }, setCustomLookback: (startDate: string, startTime: string, endDate: string, endTime: string) => { return (dispatch: ThunkDispatch, getState: () => KialiAppState) => { - if (getState().jaegerState.search.lookback === 'custom') { + if (getState().jaegerState.search.lookback <= 0) { const toTimestamp = getUnixTimeStampInMSFromForm(startDate, startTime, endDate, endTime); dispatch(JaegerActions.setCustomLookback(toTimestamp.start, toTimestamp.end)); } diff --git a/src/actions/__tests__/JaegerThunkActions.test.ts b/src/actions/__tests__/JaegerThunkActions.test.ts index 8b8dda488e..7c717ce046 100644 --- a/src/actions/__tests__/JaegerThunkActions.test.ts +++ b/src/actions/__tests__/JaegerThunkActions.test.ts @@ -1,5 +1,5 @@ import { convTagsLogfmt, getUnixTimeStampInMSFromForm, JaegerURLSearch } from '../JaegerThunkActions'; -import { JAEGER_QUERY } from '../../config'; +import { jaegerQuery } from '../../config'; import moment from 'moment-timezone'; describe('JaegerThunkActions', () => { @@ -38,21 +38,21 @@ describe('JaegerThunkActions', () => { it('JaegerURLSearch constructor', () => { expect(jaegerURLclass.url).toEqual( - `${url}${JAEGER_QUERY().PATH}?${JAEGER_QUERY().EMBED.UI_EMBED}=${JAEGER_QUERY().EMBED.VERSION}` + `${url}${jaegerQuery().path}?${jaegerQuery().embed.uiEmbed}=${jaegerQuery().embed.version}` ); }); it('JaegerURLSearch addQueryParam method with number value', () => { jaegerURLclass.addQueryParam('uiTimelineHideMinimap', 1); expect(jaegerURLclass.url).toEqual( - `${url}${JAEGER_QUERY().PATH}?${JAEGER_QUERY().EMBED.UI_EMBED}=${ - JAEGER_QUERY().EMBED.VERSION + `${url}${jaegerQuery().path}?${jaegerQuery().embed.uiEmbed}=${ + jaegerQuery().embed.version }&uiTimelineHideMinimap=1` ); jaegerURLclass.addQueryParam('uiTimelineHideSummary', '0'); expect(jaegerURLclass.url).toEqual( - `${url}${JAEGER_QUERY().PATH}?${JAEGER_QUERY().EMBED.UI_EMBED}=${ - JAEGER_QUERY().EMBED.VERSION + `${url}${jaegerQuery().path}?${jaegerQuery().embed.uiEmbed}=${ + jaegerQuery().embed.version }&uiTimelineHideMinimap=1&uiTimelineHideSummary=0` ); }); @@ -60,8 +60,8 @@ describe('JaegerThunkActions', () => { it('JaegerURLSearch addParam method', () => { jaegerURLclass.addParam('uiTimelineHideMinimap'); expect(jaegerURLclass.url).toEqual( - `${url}${JAEGER_QUERY().PATH}?${JAEGER_QUERY().EMBED.UI_EMBED}=${ - JAEGER_QUERY().EMBED.VERSION + `${url}${jaegerQuery().path}?${jaegerQuery().embed.uiEmbed}=${ + jaegerQuery().embed.version }&uiTimelineHideMinimap` ); }); diff --git a/src/components/JaegerToolbar/LookBack.tsx b/src/components/JaegerToolbar/LookBack.tsx index f9305ac643..77053bb8db 100644 --- a/src/components/JaegerToolbar/LookBack.tsx +++ b/src/components/JaegerToolbar/LookBack.tsx @@ -6,38 +6,29 @@ import ToolbarDropdown from '../../components/ToolbarDropdown/ToolbarDropdown'; import { JaegerActions } from '../../actions/JaegerActions'; import { ThunkDispatch } from 'redux-thunk'; import { KialiAppAction } from '../../actions/KialiAppAction'; +import { config } from '../../config'; interface LookBackProps { fetching: boolean; setLookback: (lookback: string) => void; - lookback: string; + lookback: number; onChangeCustom: (when: string, dateField: string, timeField: string) => void; } export class LookBack extends React.PureComponent { - lookBackOptions = { - '1h': 'Last Hour', - '2h': 'Last 2 Hours', - '3h': 'Last 3 Hours', - '6h': 'Last 6 Hours', - '12h': 'Last 12 Hours', - '24h': 'Last 24 Hours', - '2d': 'Last 2 Days', - custom: 'Custom Time Range' - }; + lookBackOptions = { ...config.toolbar.intervalDuration, ...{ 0: 'Custom Time Range' } }; constructor(props: LookBackProps) { super(props); } componentDidMount() { - this.props.setLookback(this.props.lookback); + this.props.setLookback(String(this.props.lookback)); } render() { const { lookback, fetching, setLookback, onChangeCustom } = this.props; - const tz = lookback === 'custom' ? new Date().toTimeString().replace(/^.*?GMT/, 'UTC') : null; - + const tz = lookback === 0 ? new Date().toTimeString().replace(/^.*?GMT/, 'UTC') : null; return ( @@ -117,7 +108,7 @@ const mapStateToProps = (state: KialiAppState) => { const mapDispatchToProps = (dispatch: ThunkDispatch) => { return { setLookback: (lookback: string) => { - dispatch(JaegerActions.setLookback(lookback)); + dispatch(JaegerActions.setLookback(Number(lookback))); } }; }; diff --git a/src/components/JaegerToolbar/TagsControl.tsx b/src/components/JaegerToolbar/TagsControl.tsx index 4069a27dd2..b8235c3f66 100644 --- a/src/components/JaegerToolbar/TagsControl.tsx +++ b/src/components/JaegerToolbar/TagsControl.tsx @@ -19,7 +19,7 @@ export class TagsControl extends React.PureComponent { Values should be in the{' '} - + logfmt {' '} format. diff --git a/src/components/JaegerToolbar/__tests__/LookBack.test.tsx b/src/components/JaegerToolbar/__tests__/LookBack.test.tsx index c869bc35dc..f3c1048c2f 100644 --- a/src/components/JaegerToolbar/__tests__/LookBack.test.tsx +++ b/src/components/JaegerToolbar/__tests__/LookBack.test.tsx @@ -3,17 +3,9 @@ import { shallow } from 'enzyme'; import { LookBack } from '../LookBack'; import { Form, FormGroup } from 'patternfly-react'; import ToolbarDropdown from '../../../components/ToolbarDropdown/ToolbarDropdown'; +import { config } from '../../../config'; -const lookBackOptions = { - '1h': 'Last Hour', - '2h': 'Last 2 Hours', - '3h': 'Last 3 Hours', - '6h': 'Last 6 Hours', - '12h': 'Last 12 Hours', - '24h': 'Last 24 Hours', - '2d': 'Last 2 Days', - custom: 'Custom Time Range' -}; +const lookBackOptions = { ...config.toolbar.intervalDuration, ...{ 0: 'Custom Time Range' } }; describe('LookBack', () => { let wrapper, onChangeCustom, setLookback; @@ -22,7 +14,7 @@ describe('LookBack', () => { onChangeCustom = jest.fn(); setLookback = jest.fn(); wrapper = shallow( - + ); }); @@ -33,7 +25,7 @@ describe('LookBack', () => { it('renders Extra forms when lookback is custom', () => { expect(wrapper.find(Form).length).toEqual(0); - wrapper.setProps({ lookback: 'custom' }); + wrapper.setProps({ lookback: 0 }); expect(wrapper.find(Form).length).toEqual(1); expect(wrapper.find(FormGroup).length).toEqual(2); }); diff --git a/src/components/JaegerToolbar/__tests__/__snapshots__/LookBack.test.tsx.snap b/src/components/JaegerToolbar/__tests__/__snapshots__/LookBack.test.tsx.snap index 16e0fc97f7..d34ec3ea3a 100644 --- a/src/components/JaegerToolbar/__tests__/__snapshots__/LookBack.test.tsx.snap +++ b/src/components/JaegerToolbar/__tests__/__snapshots__/LookBack.test.tsx.snap @@ -5,13 +5,13 @@ ShallowWrapper { Symbol(enzyme.__root__): [Circular], Symbol(enzyme.__unrendered__): , null, ], @@ -103,24 +107,28 @@ ShallowWrapper { "handleSelect": [MockFunction] { "calls": Array [ Array [ - "", + "3600", ], ], }, "id": "lookback-selector", - "label": undefined, + "label": "Last hour", "options": Object { - "12h": "Last 12 Hours", - "1h": "Last Hour", - "24h": "Last 24 Hours", - "2d": "Last 2 Days", - "2h": "Last 2 Hours", - "3h": "Last 3 Hours", - "6h": "Last 6 Hours", - "custom": "Custom Time Range", + "0": "Custom Time Range", + "10800": "Last 3 hours", + "1800": "Last 30 min", + "21600": "Last 6 hours", + "2592000": "Last 30 days", + "300": "Last 5 min", + "3600": "Last hour", + "43200": "Last 12 hours", + "60": "Last min", + "600": "Last 10 min", + "604800": "Last 7 days", + "86400": "Last day", }, "useName": false, - "value": "", + "value": 3600, }, "ref": null, "rendered": null, @@ -154,27 +162,31 @@ ShallowWrapper { [MockFunction] { "calls": Array [ Array [ - "", + "3600", ], ], } } id="lookback-selector" - label={undefined} + label="Last hour" options={ Object { - "12h": "Last 12 Hours", - "1h": "Last Hour", - "24h": "Last 24 Hours", - "2d": "Last 2 Days", - "2h": "Last 2 Hours", - "3h": "Last 3 Hours", - "6h": "Last 6 Hours", - "custom": "Custom Time Range", + "0": "Custom Time Range", + "10800": "Last 3 hours", + "1800": "Last 30 min", + "21600": "Last 6 hours", + "2592000": "Last 30 days", + "300": "Last 5 min", + "3600": "Last hour", + "43200": "Last 12 hours", + "60": "Last min", + "600": "Last 10 min", + "604800": "Last 7 days", + "86400": "Last day", } } useName={false} - value="" + value={3600} />, null, ], @@ -209,24 +221,28 @@ ShallowWrapper { "handleSelect": [MockFunction] { "calls": Array [ Array [ - "", + "3600", ], ], }, "id": "lookback-selector", - "label": undefined, + "label": "Last hour", "options": Object { - "12h": "Last 12 Hours", - "1h": "Last Hour", - "24h": "Last 24 Hours", - "2d": "Last 2 Days", - "2h": "Last 2 Hours", - "3h": "Last 3 Hours", - "6h": "Last 6 Hours", - "custom": "Custom Time Range", + "0": "Custom Time Range", + "10800": "Last 3 hours", + "1800": "Last 30 min", + "21600": "Last 6 hours", + "2592000": "Last 30 days", + "300": "Last 5 min", + "3600": "Last hour", + "43200": "Last 12 hours", + "60": "Last min", + "600": "Last 10 min", + "604800": "Last 7 days", + "86400": "Last day", }, "useName": false, - "value": "", + "value": 3600, }, "ref": null, "rendered": null, diff --git a/src/components/JaegerToolbar/__tests__/__snapshots__/TagsControl.test.tsx.snap b/src/components/JaegerToolbar/__tests__/__snapshots__/TagsControl.test.tsx.snap index 5135e2f8e6..6cbacd556e 100644 --- a/src/components/JaegerToolbar/__tests__/__snapshots__/TagsControl.test.tsx.snap +++ b/src/components/JaegerToolbar/__tests__/__snapshots__/TagsControl.test.tsx.snap @@ -47,6 +47,7 @@ ShallowWrapper { logfmt @@ -128,6 +129,7 @@ ShallowWrapper { logfmt @@ -188,6 +190,7 @@ ShallowWrapper { logfmt @@ -281,6 +284,7 @@ ShallowWrapper { logfmt @@ -362,6 +366,7 @@ ShallowWrapper { logfmt @@ -422,6 +427,7 @@ ShallowWrapper { logfmt diff --git a/src/components/Nav/Navigation.tsx b/src/components/Nav/Navigation.tsx index 8829ef55a3..5dbadc25d3 100644 --- a/src/components/Nav/Navigation.tsx +++ b/src/components/Nav/Navigation.tsx @@ -24,6 +24,7 @@ type PropsType = RouteComponentProps & { checkCredentials: () => void; setNavCollapsed: (collapse: boolean) => void; jaegerUrl: string; + enableIntegration: boolean; }; class Navigation extends React.Component { @@ -71,6 +72,17 @@ class Navigation extends React.Component { return isRoute; }); return navItems.map(item => { + if (item.title === 'Distributed Tracing' && !this.props.enableIntegration && this.props.jaegerUrl !== '') { + return ( + this.goTojaeger()} + /> + ); + } return item.title === 'Distributed Tracing' && this.props.jaegerUrl === '' ? ( '' ) : ( diff --git a/src/components/Nav/__tests__/Navigation.test.tsx b/src/components/Nav/__tests__/Navigation.test.tsx index 05f2bb2ceb..bad85d087a 100644 --- a/src/components/Nav/__tests__/Navigation.test.tsx +++ b/src/components/Nav/__tests__/Navigation.test.tsx @@ -56,6 +56,7 @@ const _tester = (path: string, expectedMenuPath: string) => { navCollapsed={false} setNavCollapsed={jest.fn()} jaegerUrl={''} + enableIntegration={false} {...routerProps} /> ); diff --git a/src/config/index.ts b/src/config/index.ts index dc0edc9d1b..aad4a49852 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -12,6 +12,6 @@ import { kialiLogo } from './logos'; import { Paths } from './Paths'; // Jaeger Query -import { JAEGER_QUERY } from './jaegerQuery'; +import { jaegerQuery } from './jaegerQuery'; -export { config, Paths, icons, kialiLogo, JAEGER_QUERY }; +export { config, Paths, icons, kialiLogo, jaegerQuery }; diff --git a/src/config/jaegerQuery.ts b/src/config/jaegerQuery.ts index d6580d0307..e4e14990b6 100644 --- a/src/config/jaegerQuery.ts +++ b/src/config/jaegerQuery.ts @@ -1,27 +1,27 @@ import deepFreeze from 'deep-freeze'; -const jaegerQuery = { - PATH: '/search', - OPTIONS: { - START_TIME: 'start', - END_TIME: 'end', - LIMIT_TRACES: 'limit', - LOOKBACK: 'lookback', - MAX_DURATION: 'maxDuration', - MIN_DURATION: 'minDuration', - SERVICE_SELECTOR: 'service', - TAGS: 'tags' +const jaegerQueryConfig = { + path: '/search', + options: { + startTime: 'start', + endTime: 'end', + limitTraces: 'limit', + lookback: 'lookback', + maxDuration: 'maxDuration', + minDuration: 'minDuration', + serviceSelector: 'service', + tags: 'tags' }, - EMBED: { - UI_EMBED: 'uiEmbed', - UI_SEARCH_HIDE_GRAPH: 'uiSearchHideGraph', - UI_TRACE_COLLAPSE_TITLE: 'uiTimelineCollapseTitle', - UI_TRACE_HIDE_MINIMAP: 'uiTimelineHideMinimap', - UI_TRACE_HIDE_SUMMARY: 'uiTimelineHideSummary', - VERSION: 'v0' + embed: { + uiEmbed: 'uiEmbed', + uiSearchHideGraph: 'uiSearchHideGraph', + uiTraceCollapseTitle: 'uiTimelineCollapseTitle', + uiTraceHideMinimap: 'uiTimelineHideMinimap', + uiTraceHideSummary: 'uiTimelineHideSummary', + version: 'v0' } }; -export const JAEGER_QUERY = () => { - return deepFreeze(jaegerQuery) as typeof jaegerQuery; +export const jaegerQuery = () => { + return deepFreeze(jaegerQueryConfig) as typeof jaegerQueryConfig; }; diff --git a/src/containers/NavigationContainer.ts b/src/containers/NavigationContainer.ts index d882354830..d8eead60a2 100644 --- a/src/containers/NavigationContainer.ts +++ b/src/containers/NavigationContainer.ts @@ -14,7 +14,8 @@ const getJaegerUrl = (components: Component[]) => { const mapStateToProps = (state: KialiAppState) => ({ authenticated: state.authentication.status === LoginStatus.loggedIn, navCollapsed: state.userSettings.interface.navCollapse, - jaegerUrl: getJaegerUrl(state.statusState.components) + jaegerUrl: getJaegerUrl(state.statusState.components), + enableIntegration: state.jaegerState.enableIntegration }); const mapDispatchToProps = (dispatch: ThunkDispatch) => ({ diff --git a/src/containers/ServiceDetailsPageContainer.ts b/src/containers/ServiceDetailsPageContainer.ts index 5cb8e12a19..ee0db09390 100644 --- a/src/containers/ServiceDetailsPageContainer.ts +++ b/src/containers/ServiceDetailsPageContainer.ts @@ -8,7 +8,8 @@ const getJaegerUrl = (components: Component[]) => { }; const mapStateToProps = (state: KialiAppState) => ({ - jaegerUrl: getJaegerUrl(state.statusState.components) + jaegerUrl: getJaegerUrl(state.statusState.components), + enableIntegration: state.jaegerState.enableIntegration }); const ServiceDetailsPageContainer = connect(mapStateToProps)(ServiceDetailsPage); diff --git a/src/pages/ServiceDetails/ServiceDetailsPage.tsx b/src/pages/ServiceDetails/ServiceDetailsPage.tsx index 5d745993ac..a6a91fd212 100644 --- a/src/pages/ServiceDetails/ServiceDetailsPage.tsx +++ b/src/pages/ServiceDetails/ServiceDetailsPage.tsx @@ -21,6 +21,7 @@ type ServiceDetailsState = { interface ServiceDetailsProps extends RouteComponentProps { jaegerUrl: string; + enableIntegration: boolean; getErrorTraces: (service: string) => void; } @@ -155,7 +156,10 @@ class ServiceDetails extends React.Component { - window.open(this.props.jaegerUrl + `/search?service=${this.props.match.params.service}`, '_blank'); + window.open( + this.props.jaegerUrl + `/search?service=${this.props.match.params.service}.${this.props.match.params.namespace}`, + '_blank' + ); }; render() { @@ -172,9 +176,9 @@ class ServiceDetails extends React.Component
Inbound Metrics
- {this.props.jaegerUrl && ( + {this.props.enableIntegration ? ( -
+ <> Error Traces{' '} ({errorTraces} @@ -183,7 +187,13 @@ class ServiceDetails extends React.Component -
+ +
+ ) : ( + + <> + Traces + )} @@ -207,7 +217,7 @@ class ServiceDetails extends React.Component - {this.props.jaegerUrl && ( + {this.props.enableIntegration && ( { - let multiplier = 60 * 60 * 1000 * 1000; - if (lookback.slice(-1) === 'd') { - multiplier *= 24; - } - return Number(lookback.slice(0, -1)) * multiplier; +export const converToTimestamp = (lookback: number): number => { + const multiplier = 1000 * 1000; + return lookback * multiplier; }; const JaegerState = (state: JaegerState = INITIAL_JAEGER_STATE, action: KialiAppAction): JaegerState => { switch (action.type) { + case getType(JaegerActions.setEnableIntegration): + return updateState(state, { + enableIntegration: action.payload + }); case getType(JaegerActions.setUrl): return updateState(state, { jaegerURL: action.payload.url @@ -133,9 +135,8 @@ const JaegerState = (state: JaegerState = INITIAL_JAEGER_STATE, action: KialiApp }); case getType(JaegerActions.setLookback): { const nowTime = Date.now() * 1000; - const endTime = action.payload !== 'custom' ? `${nowTime}` : state.search.start; - const startTime = - action.payload !== 'custom' ? `${nowTime - converToTimestamp(action.payload)}` : state.search.end; + const endTime = action.payload > 0 ? `${nowTime}` : state.search.start; + const startTime = action.payload > 0 ? `${nowTime - converToTimestamp(action.payload)}` : state.search.end; return updateState(state, { search: { namespaceSelected: state.search.namespaceSelected, diff --git a/src/reducers/__tests__/JaegerStateReducer.test.ts b/src/reducers/__tests__/JaegerStateReducer.test.ts index 5627968688..65bc1dc26c 100644 --- a/src/reducers/__tests__/JaegerStateReducer.test.ts +++ b/src/reducers/__tests__/JaegerStateReducer.test.ts @@ -1,5 +1,6 @@ import JaegerState, { converToTimestamp } from '../JaegerState'; import { JaegerActions } from '../../actions/JaegerActions'; +import { config } from '../../config'; const initialState = { toolbar: { @@ -15,7 +16,7 @@ const initialState = { end: '', minDuration: '', maxDuration: '', - lookback: '1h', + lookback: 3600, url: '', tags: '' }, @@ -24,7 +25,8 @@ const initialState = { hideSummary: false, hideMinimap: false }, - jaegerURL: '' + jaegerURL: '', + enableIntegration: false }; describe('JaegerState reducer', () => { @@ -81,19 +83,14 @@ describe('JaegerState reducer', () => { describe('should set Lookback', () => { it('method converToTimestamp', () => { - const useCases = ['1h', '2h', '3h', '6h', '12h', '24h', '2d']; - const multiplier = 60 * 60 * 1000 * 1000; - useCases.forEach(c => { - let mul = multiplier; - if (c.slice(-1) === 'd') { - mul *= 24; - } - expect(converToTimestamp(c)).toEqual(Number(c.slice(0, -1)) * mul); + const multiplier = 1000 * 1000; + Object.keys(config.toolbar.intervalDuration).forEach(key => { + expect(converToTimestamp(Number(key))).toEqual(Number(key) * multiplier); }); }); it('lookback with custom', () => { - const lookback = 'custom'; + const lookback = 0; expectedState.search.lookback = lookback; expect(JaegerState(initialState, JaegerActions.setLookback(lookback))).toEqual(expectedState); }); diff --git a/src/services/Api.ts b/src/services/Api.ts index 293d19eaa1..ff2883295e 100644 --- a/src/services/Api.ts +++ b/src/services/Api.ts @@ -50,7 +50,7 @@ const basicAuth = (username: UserName, password: Password) => { return { username: username, password: password }; }; -export const newRequest =

(method: HTTP_VERBS, url: string, queryParams: any, data: any, auth?: AuthToken) => +const newRequest =

(method: HTTP_VERBS, url: string, queryParams: any, data: any, auth?: AuthToken) => axios.request

({ method: method, url: url, diff --git a/src/store/Store.ts b/src/store/Store.ts index 50fae58614..630752d16e 100644 --- a/src/store/Store.ts +++ b/src/store/Store.ts @@ -139,7 +139,7 @@ export interface JaegerState { end: string; minDuration: string; maxDuration: string; - lookback: string; + lookback: number; url: string; tags: string; }; @@ -149,6 +149,7 @@ export interface JaegerState { hideMinimap: boolean; }; jaegerURL: string; + enableIntegration: boolean; } // This defines the Kiali Global Application State diff --git a/yarn.lock b/yarn.lock index 31876ddec8..bf4992369d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6237,7 +6237,7 @@ lodash@4.17.11, lodash@4.x, "lodash@>=3.5 <5", lodash@^4, lodash@^4.0.0, lodash@ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -logfmt@^1.2.1: +logfmt@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/logfmt/-/logfmt-1.2.1.tgz#0e99838eb3a87fb6272d6d2b4fc327b95a29abee" integrity sha512-QlZuQi8AlGbrXfW7LrxH/lhyFjI6Xr2DNSrIzhtIJAicAgl21P2gHpqABR3Sh0Kd4dvwTAej6jDVdh0o/HwfcA==