You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@skywalking.apache.org by ha...@apache.org on 2018/04/28 09:44:20 UTC

[incubator-skywalking-ui] branch 5.0.0/beta updated: Add time range to trace page

This is an automated email from the ASF dual-hosted git repository.

hanahmily pushed a commit to branch 5.0.0/beta
in repository https://gitbox.apache.org/repos/asf/incubator-skywalking-ui.git


The following commit(s) were added to refs/heads/5.0.0/beta by this push:
     new b94ae20  Add time range to trace page
b94ae20 is described below

commit b94ae20d16e9f1dc5c1ba624738c9e3bf869a594
Author: hanahmily <ha...@gmail.com>
AuthorDate: Sat Apr 28 17:18:10 2018 +0800

    Add time range to trace page
---
 src/layouts/BasicLayout.js      |  17 ++++--
 src/models/trace.js             |  15 ++++-
 src/routes/Trace/Trace.js       |   2 -
 src/routes/Trace/TraceSearch.js | 119 ++++++++++++++++++++++++----------------
 src/utils/models.js             |   3 +-
 src/utils/time.js               |   4 ++
 6 files changed, 104 insertions(+), 56 deletions(-)

diff --git a/src/layouts/BasicLayout.js b/src/layouts/BasicLayout.js
index 5b6e0d6..f68b215 100644
--- a/src/layouts/BasicLayout.js
+++ b/src/layouts/BasicLayout.js
@@ -88,7 +88,10 @@ class BasicLayout extends React.PureComponent {
     };
   }
   componentWillUpdate(nextProps) {
-    const { globalVariables: { duration } } = nextProps;
+    const { globalVariables: { duration }, isMonitor } = nextProps;
+    if (!isMonitor) {
+      return;
+    }
     if (!duration || Object.keys(duration).length < 1) {
       return;
     }
@@ -214,11 +217,13 @@ class BasicLayout extends React.PureComponent {
             onDurationReload={this.handleDurationReload}
             onRedirect={this.handleRedirect}
           />
-          <DurationPanel
-            selected={dSelected}
-            onSelected={this.handleDurationSelected}
-            collapsed={dCollapsed}
-          />
+          {isMonitor ? (
+            <DurationPanel
+              selected={dSelected}
+              onSelected={this.handleDurationSelected}
+              collapsed={dCollapsed}
+            />
+          ) : null}
           <Content style={{ margin: '24px 24px 0', height: '100%' }}>
             <Switch>
               {
diff --git a/src/models/trace.js b/src/models/trace.js
index 48184e9..131ff01 100644
--- a/src/models/trace.js
+++ b/src/models/trace.js
@@ -15,9 +15,10 @@
  * limitations under the License.
  */
 
-
+import moment from 'moment';
 import { query } from '../services/graphql';
 import { generateModal } from '../utils/models';
+import { generateDuration } from '../utils/time';
 
 const optionsQuery = `
   query ApplicationOption($duration: Duration!) {
@@ -93,6 +94,18 @@ export default generateModal({
     },
     showTimeline: false,
   },
+  varState: {
+    values: {
+      duration: generateDuration({
+        from() {
+          return moment().subtract(15, 'minutes');
+        },
+        to() {
+          return moment();
+        },
+      }),
+    },
+  },
   optionsQuery,
   defaultOption: {
     applicationId: {
diff --git a/src/routes/Trace/Trace.js b/src/routes/Trace/Trace.js
index 414e4b1..9986f8d 100644
--- a/src/routes/Trace/Trace.js
+++ b/src/routes/Trace/Trace.js
@@ -24,9 +24,7 @@ import TraceTimeline from './TraceTimeline';
 
 @connect(state => ({
   trace: state.trace,
-  duration: state.global.duration,
   loading: state.loading.models.trace,
-  globalVariables: state.global.globalVariables,
 }))
 export default class Trace extends PureComponent {
   handleGoBack = () => {
diff --git a/src/routes/Trace/TraceSearch.js b/src/routes/Trace/TraceSearch.js
index 8f6698f..8e0cdaa 100644
--- a/src/routes/Trace/TraceSearch.js
+++ b/src/routes/Trace/TraceSearch.js
@@ -16,15 +16,16 @@
  */
 
 import React, { PureComponent } from 'react';
-import { Form, Input, Select, Button, Card, InputNumber, Row, Col, Pagination } from 'antd';
+import { Form, Input, Select, Button, Card, InputNumber, Row, Col, Pagination, DatePicker } from 'antd';
 import { Chart, Geom, Axis, Tooltip, Legend } from 'bizcharts';
 import { DataSet } from '@antv/data-set';
 import moment from 'moment';
 import TraceList from '../../components/Trace/TraceList';
-import { Panel } from '../../components/Page';
+import { generateDuration } from '../../utils/time';
 import styles from './Trace.less';
 
 const { Option } = Select;
+const { RangePicker } = DatePicker;
 const FormItem = Form.Item;
 const initPaging = {
   pageNum: 1,
@@ -36,79 +37,101 @@ const initPaging = {
   mapPropsToFields(props) {
     const { variables: { values } } = props.trace;
     const result = {};
-    Object.keys(values).forEach((_) => {
+    Object.keys(values).filter(_ => _ !== 'range-time-picker').forEach((_) => {
       result[_] = Form.createFormField({
         value: values[_],
       });
     });
+    const { duration } = values;
+    if (duration) {
+      result['range-time-picker'] = Form.createFormField({
+        value: [duration.raw.start, duration.raw.end],
+      });
+    }
     return result;
   },
 })
 export default class Trace extends PureComponent {
   componentDidMount() {
+    const { trace: { variables: { values } } } = this.props;
+    const { duration } = values;
     this.props.dispatch({
       type: 'trace/initOptions',
-      payload: { variables: this.props.globalVariables },
-    });
-  }
-  componentWillUpdate(nextProps) {
-    if (nextProps.globalVariables.duration === this.props.globalVariables.duration) {
-      return;
-    }
-    this.props.dispatch({
-      type: 'trace/initOptions',
-      payload: { variables: nextProps.globalVariables },
+      payload: { variables: { duration: duration.input } },
     });
+    const condition = { ...values };
+    condition.queryDuration = values.duration.input;
+    delete condition.duration;
+    this.fetchData(condition, initPaging);
   }
-  handleChange = (variables) => {
-    const filteredVariables = { ...variables };
-    filteredVariables.queryDuration = filteredVariables.duration;
-    delete filteredVariables.duration;
-    if (!filteredVariables.paging) {
-      filteredVariables.paging = initPaging;
-    }
-    this.props.dispatch({
-      type: 'trace/fetchData',
-      payload: { variables: { condition: filteredVariables } },
+  getDefaultDuration = () => {
+    return generateDuration({
+      from() {
+        return moment().subtract(15, 'minutes');
+      },
+      to() {
+        return moment();
+      },
     });
   }
   handleSearch = (e) => {
     if (e) {
       e.preventDefault();
     }
-    const { dispatch, form, globalVariables: { duration } } = this.props;
+    const { form, dispatch } = this.props;
 
     form.validateFields((err, fieldsValue) => {
       if (err) return;
+      const condition = { ...fieldsValue };
+      delete condition['range-time-picker'];
+      const rangeTime = fieldsValue['range-time-picker'];
+      const duration = generateDuration({ from: () => rangeTime[0], to: () => rangeTime[1] });
       dispatch({
         type: 'trace/saveVariables',
         payload: {
           values: {
-            ...fieldsValue,
-            queryDuration: duration,
+            ...condition,
+            duration,
             paging: initPaging,
           },
         },
       });
+      this.fetchData({ ...condition, queryDuration: duration.input });
+    });
+  }
+  fetchData = (queryCondition, paging = initPaging) => {
+    this.props.dispatch({
+      type: 'trace/fetchData',
+      payload: {
+        variables: {
+          condition: {
+            ...queryCondition,
+            paging,
+          },
+        },
+      },
     });
   }
   handleTableChange = (pagination) => {
-    const { dispatch, globalVariables: { duration },
-      trace: { variables: { values } } } = this.props;
+    const { dispatch, trace: { variables: { values } } } = this.props;
+    const condition = {
+      ...values,
+      paging: {
+        pageNum: pagination.current,
+        pageSize: pagination.pageSize,
+        needTotal: true,
+      },
+    };
     dispatch({
       type: 'trace/saveVariables',
       payload: {
         values: {
-          ...values,
-          queryDuration: duration,
-          paging: {
-            pageNum: pagination.current,
-            pageSize: pagination.pageSize,
-            needTotal: true,
-          },
+          ...condition,
         },
       },
     });
+    delete condition.duration;
+    this.fetchData({ ...condition, queryDuration: values.duration.input }, condition.paging);
   }
   handleShowTrace = (traceId) => {
     const { dispatch } = this.props;
@@ -186,6 +209,16 @@ export default class Trace extends PureComponent {
     const { trace: { variables: { options } } } = this.props;
     return (
       <Form onSubmit={this.handleSearch} layout="vertical">
+        <FormItem label="Time Range">
+          {getFieldDecorator('range-time-picker')(
+            <RangePicker
+              showTime
+              disabledDate={current => current && current.valueOf() >= Date.now()}
+              format="YYYY-MM-DD HH:mm"
+              style={{ width: '100%' }}
+            />
+          )}
+        </FormItem>
         <FormItem label="Application">
           {getFieldDecorator('applicationId')(
             <Select placeholder="All application" style={{ width: '100%' }}>
@@ -276,17 +309,11 @@ export default class Trace extends PureComponent {
             </Col>
           </Row>
           {this.renderPage(values, queryBasicTraces.total)}
-          <Panel
-            variables={values}
-            globalVariables={this.props.globalVariables}
-            onChange={this.handleChange}
-          >
-            <TraceList
-              loading={loading}
-              data={queryBasicTraces.traces}
-              onClickTraceTag={this.handleShowTrace}
-            />
-          </Panel>
+          <TraceList
+            loading={loading}
+            data={queryBasicTraces.traces}
+            onClickTraceTag={this.handleShowTrace}
+          />
           {this.renderPage(values, queryBasicTraces.total)}
         </div>
       </Card>
diff --git a/src/utils/models.js b/src/utils/models.js
index 26cd596..25a064a 100644
--- a/src/utils/models.js
+++ b/src/utils/models.js
@@ -19,7 +19,7 @@
 import { query as queryService } from '../services/graphql';
 
 export function generateModal({ namespace, dataQuery, optionsQuery, defaultOption, state = {},
-  effects = {}, reducers = {}, subscriptions = {} }) {
+  varState = {}, effects = {}, reducers = {}, subscriptions = {} }) {
   return {
     namespace,
     state: {
@@ -27,6 +27,7 @@ export function generateModal({ namespace, dataQuery, optionsQuery, defaultOptio
         values: {},
         labels: {},
         options: {},
+        ...varState,
       },
       data: state,
     },
diff --git a/src/utils/time.js b/src/utils/time.js
index abe3e82..a547acb 100644
--- a/src/utils/time.js
+++ b/src/utils/time.js
@@ -38,6 +38,10 @@ export function generateDuration({ from, to }) {
       range: Array.from({ length: end.diff(start, measureType) + 1 },
         (v, i) => start.clone().add(i, measureType).format(displayFormat)),
     },
+    raw: {
+      start,
+      end,
+    },
   };
 }
 

-- 
To stop receiving notification emails like this one, please contact
hanahmily@apache.org.