Commit Graph

35 Commits

Author SHA1 Message Date
Tharun Rajendran b45abeaad5
Fix tap filter authority (#4810)
Tap component is calling fetch metrics with skip_stats and authority
service type is not sent.So, authority dropdown is not getting populated.

Added a seperate call to get metrics for authority

Fixes #4697

Signed-off-by: Tharun <rajendrantharun@live.com>
2020-08-20 09:05:53 -07:00
Kevin Lingerfelt 1ce6efaecf
Adopt more common Javascript linting conventions (#3882)
The current set of Javascript linting rules that we're using in this
project is outdated, and it has lead to a variety of competing styles
in the Javascript codebase.

Update the project's linting rules to match those provided by the latest
release of eslint-config-airbnb, but disable a bunch of rules that
aren't compatible with this project.

I've split this change into two commits. The first commit contains the
manual changes that I made to satisfy the new rules, and the second
commit contains all of the whitespace, quoting and commas changes that
were fixed automatically by eslint.

Signed-off-by: Kevin Lingerfelt <kl@buoyant.io>
2020-01-08 15:01:16 -08:00
Cynthia S. Garcia f55b2f4e38 Pause dashboard network activity when page is hidden (#3773)
This PR pauses the network activity when the dashboard is not visible, resuming
it as soon as the user goes back to it. To do that, we are using the
react-page-visibility library.

Signed-off-by: Cintia Sanchez Garcia <cynthiasg@icloud.com>
2019-12-17 15:34:18 -08:00
Cynthia S. Garcia a564609ed5 Update dashboard to React 16.11.0 (#3737)
This PR updates `react` and `react-dom` to version 16.11.0, and `react-router`
and `react-router-dom` to version 5.1.2.

The following breaking changes have been fixed as part of the upgrade:

- Change deprecated `componentWillUpdate` to `componentDidUpdate` 
- Replace`react-url-query` library with `use-query-params` (a Hook) due 
to the deprecation of some React lifecycle methods. This required some 
changes in the Tap, Top, TapQueryForm and TopRoutes components.

Fixes #3617

Signed-off-by: Cintia Sanchez Garcia <cynthiasg@icloud.com>
2019-12-04 10:10:56 -08:00
Cynthia S. Garcia 18eb984fd5 Display tap headers in dashboard (#3663)
Closes #3612. This PR adds tap headers to the dashboard. Headers are displayed
when the user clicks on the "expand view" icon of each tap row.

Signed-off-by: Cintia Sanchez Garcia <cynthiasg@icloud.com>
2019-11-12 13:48:12 -08:00
Alejandro Pedraza 5d7499dc84
Avoid the dashboard requesting stats when not needed (#3338)
* Avoid the dashboard requesting stats when not needed

Create an alternative to `urlsForResource` called
`urlsForResourceNoStats` that makes use of the `skip_stats` parameter in
the stats API (created in #1871) that doesn't query Prometheus when not needed.

When testing using the dashboard looking at the linkerd namespace,
queries per second went down from 2874 to 2756, a 4% decrease.

Signed-off-by: Alejandro Pedraza <alejandro@buoyant.io>
2019-08-29 05:52:44 -05:00
Kevin Leimkuhler 5d7662fd90
Update web server to use tap APIService (#3208)
### Motivation

PR #3167 introduced the tap APIService and migrated `linkerd tap` to use it.
Subsequent PRs (#3186 and #3187) updated `linkerd top` and `linkerd profile
--tap` to use the tap APIService. This PR moves the web's Go server to now also
use the tap APIService instead of the public API. It also ensures an error
banner is shown to the user when unauthorized taps fail via `linkerd top`
command in *Overview* and *Top*, and `linkerd tap` command in *Tap*.

### Details

The majority of these changes are focused around piping through the HTTP error
that occurs and making sure the error banner generated displays the error
message explaining to view the tap RBAC docs.

`httpError` is now public (`HTTPError`) and the error message generated is short
enough to fit in a control frame (explained [here](https://github.com/linkerd/linkerd2/blob/kleimkuhler%2Fweb-tap-apiserver/web/srv/api_handlers.go#L173-L175)).

### Testing

The error we are testing for only occurs when the linkerd-web service account is
not authorzied to tap resources. Unforutnately that is not the case on Docker
For Mac (assuming that is what you use locally), so you'll need to test on a
different cluster. I chose a GKE cluster made through the GKE console--not made
through cluster-utils because it adds cluster-admin.

Checkout the branch locally and `bin/docker-build` or `ares-build` if you have
it setup. It should produce a linkerd with the version `git-04e61786`. I have
already pushed the dependent components, so you won't need to `bin/docker-push
git-04e61786`.

Install linkerd on this GKE cluster and try to run `tap` or `top` commands via
the web. You should see the following errors:

### Tap

![web-tap-unauthorized](https://user-images.githubusercontent.com/4572153/62661243-51464900-b925-11e9-907b-29d7ca3f815d.png)

### Top

![web-top-unauthorized](https://user-images.githubusercontent.com/4572153/62661308-894d8c00-b925-11e9-9498-6c9d38b371f6.png)

Signed-off-by: Kevin Leimkuhler <kleimkuhler@icloud.com>
2019-08-08 10:18:32 -07:00
Risha Mars a609dd5894
Reduce webpack bundle size: import lodash by module (#2028)
Imports lodash function individually, eliminate 'import _ from lodash'

This branch replaces imports of all of lodash (import _ from 'lodash' with per
function imports e..g import _isNil from 'lodash/isNil'. This reduces the bundle
size from~520 kb to ~160kb.

I've also taken the opportunity to replace our use of lodash functions with
native js functions where it makes sense (e.g. some maps, concats, sizes).
2019-01-03 13:50:46 -05:00
Risha Mars 7ea867843b
Show Top Routes in sidebar, change forms to query all resources (#1937)
Now that #1921 has merged, we can query for top routes for any resource, 
not just services.

This PR adds a dropdown for all resources to the Top Routes query form.

It also adds a link to the Top Routes page in the sidebar.
2018-12-05 15:15:40 -08:00
Risha Mars dd44e10a58
Display the correct command name for the cli equivalent (#1907)
Previously, we were passing in "tap" as the command name for both the tap and
top forms, resulting in the equivalent CLI command always being linkerd tap
regardless of whether you were in the Tap or Top view.

Fix this to correctly pass in tap or top depending on the page.
2018-12-03 12:22:00 -08:00
Risha Mars e69da1b8a8
Move the dashboard's component library from antd to material-ui (#1776)
Switch the dashboard's component library from antd to material-ui.

There are extensive changes to most of the frontend components in the app.

This branch changes all uses of antd components to their closest equivalent in
material. There is still a lot of polish that needs to go into the look of
individual components, but since the major component rewrites are done, I think
get this work in so that further work can be done in smaller branches.

Changes in this branch:

- add Material-UI 3.2.2 to the project
- replace all uses of antd with material-ui components
- remove antd from the project
- slight modifications of eslint rules 
- restructuring of app components to be rendered under the Navigation 
component 
- deleted most of our css (replaced with material's inline styles) 
- pinned package versions in package.json (mostly removing ^)
2018-10-19 11:23:43 -07:00
Risha Mars 3875fe8074
Add a clear button to the tap and top query forms (#1718)
* Add a clear button to the tap and top query forms

Add clear functionality to Tap

Add clear functionality to Top

Fix a react key error when there were multiple unmeshed upstreams

Fix bug where tap results from other queries persisted when changing the query

Fix key error in autocomplete dropdown
2018-09-28 15:23:33 -07:00
Risha Mars b14ca77266
Stop trying to call setState on unmounted Tap and Top components (#1694) 2018-09-24 10:43:15 -07:00
Risha Mars 1caaefd5c8
Fix errors on the tap form when clearing items (#1666)
If you select a from namespace and from resource in /tap and try to clear them
using the little x in the form field, there would be a huge js error causing the
app to not render. Fix this.

Also removes filterOptions which wasn't being used any more. This will probably
make parsing tap results ever so slightly faster as we're now not trying to also
aggregate potential filter options.

* Fix js errors on Tap form when Clear button is hit
* Remove filter options code since we're not using the filters anywhere
2018-09-17 14:28:01 -07:00
Dennis Adjei-Baah 9951a6e864
Ignore websockets error code 1006 (#1649)
When a websocket connection is closed between Chrome and a server, we get a 1006 error code signifying abnormal closure of the websocket connection. It seems as if we only get this error on Chrome web clients. Firefox and Safari do not encounter this issue.

The solution is to suppress 1006 errors that occur in the web browser since the connection is closed anyway. There is no negative side effect that occurs when the connection is closed abnormally and so the error message is benign.

fixes #1630  

Signed-off-by: Dennis Adjei-Baah <dennis@buoyant.io>
2018-09-17 13:46:25 -07:00
Kevin Lingerfelt 0992af6b47
Add link to tap each row in top table (#1643)
* Add link to tap each row in top table
* Fix tap col width, fallback to dest pods

Signed-off-by: Kevin Lingerfelt <kl@buoyant.io>
2018-09-14 14:35:13 -07:00
Risha Mars 01be78e455
Consolidate the source and destination columns in the Tap and Top tables (#1620)
Consolidate the source and destination columns into one column, 
and add a direction column (To/From) so the user knows if the 
displayed resource is src/dst.
2018-09-12 13:30:52 -07:00
Andrew Seigner 6c45c07ede
Display more helpful websocket errors (#1626)
The web client displays `Websocket [code]` on websocket close errors.

Modify the web client to render a more helpful error message to the
user. If a reason is present, render that, otherwise translate the
websocket error code into a message.

Fixes #1599

Signed-off-by: Andrew Seigner <siggy@buoyant.io>
2018-09-12 11:29:11 -07:00
Dennis Adjei-Baah b1181e552d
Add breadcrumb navigation at the top of linkerd dashboard (#1613)
This PR adds a breadcrumb style navigation to the Linkerd dashboard. Each "crumb" links to its corresponding page in the UI.

This PR also includes a small UI fix in the sidebar. The select box always seems to revert to the All Namespaces option whenever there is a state change on the React side. The fix ensures that the select box always displays the namespace filter if it is available and revert to All Namespaces when no namespace is selected.

fixes #1464
fixes #1543
fixes #1627

Signed-off-by: Dennis Adjei-Baah <dennis@buoyant.io>
2018-09-12 09:22:01 -07:00
Kevin Lingerfelt c4a0278a75
Improve performance of tap table by throttling updates (#1623)
* Improve performance of tap table by throttling updates
* Rename debounced to throttled

Signed-off-by: Kevin Lingerfelt <kl@buoyant.io>
2018-09-11 14:28:54 -07:00
Risha Mars 0eaa9e4952
Tap the entire namespace if no resource is specified (#1558)
- Use an ant Select instead of Autocomplete for resource list, so that the user
can see all available tappable resources 

- Fix bug where the authority autocomplete wasn't showing any options 

- Adds "namespace/" as an option in the resource selection dropdown

This required some weird handling because we allow requests of the form
linkerd tap namespace/linkerd (taps namespace linkerd)
but not
linkerd tap namespace --namespace linkerd (does not work as intended, 
taps every namespace)
2018-08-31 15:50:48 -07:00
Risha Mars 249b51f950
Increase MaxRps in Tap server, remove default setting from Web (#1560)
Increase the MaxRps on the tap server to 100 RPS.

The max RPS for tap/top was increased in for the CLI #1531, but we were
still manually setting this to 1 RPS in the Web UI and Web server.

Remove the pervasive setting of MaxRps to 1 in the web frontend and server
2018-08-30 13:37:37 -07:00
Risha Mars f9b27c7ef2
Miscellaneous small web UI fixes (#1536)
A bunch of small items. 

This branch:
- filters out un-meshed resources from the Tap and Top autocompletes
- removes an un-rendered title attribute from the sidebar menu items
- formats latency in Tap with a comma
- prevents the grafana link from showing if there are 0 pods in a deployment
2018-08-29 10:56:07 -07:00
Alex Leong 1f42996889
Document tps-reports (#1509)
It's not obvious from the name what the tps-reports API endpoint does.

Added a few comments to clarify.

Signed-off-by: Alex Leong <alex@buoyant.io>
2018-08-24 13:26:35 -07:00
Risha Mars 3fde755a8f
Add top request table to resource detail page (#1507)
Includes a substantial refactor of Top.jsx to move the websocket
and top-request-aggregation code into a self-contained module
so that this code can be shared by /top and by each resource
detail page.

(This refactor also helps separate concerns in that
page; since that page also makes 10 second requests to the stat
api to populate the autocompletes in the form).

The TopModule uses the startTap prop to figure out whether it
should start a websocket connection and make a tap request
when mounted. (This is because the resource detail pages
start tapping immediately upon load, whereas /top can only
start once you've entered a query.

I've removed the spinner and the awaitingWebSocketConnection
state field because that now belongs in the top module. I think a
similar refactor of tap would be good before we re-add it.
2018-08-22 18:18:35 -07:00
Risha Mars 70babbaeba
linkerd top GUI (#1454)
Add a Top page to the linkerd web UI. This is the web equivalent of #1435.
I've used the same fields as in the current implementation.
This branch also includes some slight refactors to the Tap code to enable code reuse.

The request processing logic is pretty similar to that in Tap.jsx, except that we can 
immediately discard the result once we receive the response end and aggregate 
that result into the top results. So the index of tap results will tend to be smaller 
(unless they're long running requests like streaming). But we also add a similar 
index of aggregated Top results, and discard oldest results if top has been
running for a long time.

* Add a Top page to the web UI
* Refactor Tap event parsing into common util code
* Small refactors to the TapQueryForm and the CliCmd display to accomodate Top
* Collate tap events based on the ID (src, dst, stream)
* Also refactor keying of req/rsp/end into requestInit/responseInit/responseEnd for clarity
* Use pod labels when present in top
* Fix bug where src/dst were switched in the Tap display table
2018-08-16 10:51:19 -07:00
Risha Mars e5ab124d76
Refactor Tap query form into its own component (#1446)
Tap.jsx is really large and contains a lot of logic that pertains only to the Tap Query Form.
This PR tries to separate the concerns of the form and the query display from the main 
Tap querying and rendering logic. 
This will also allow us to easily reuse this form/CLI formatting for the Top page.

Changes in this PR:

* moves all the code for the form into its own component (TapQueryForm)
* moves the code that displays the current query into its own component (TapQueryCliCmd)
* formats the current tap query as the equivalent command line format that you 
can paste into a terminal
2018-08-14 11:29:35 -07:00
Risha Mars 142d1d8747
Correctly pass tap errors into the ErrorBanner component (#1443)
We have a new format for displaying errors in ErrorBanner. 
When a websocket error occurred, we'd pass in text where ErrorBanner 
expects and object. This PR puts the websocket errors in an object

Also clean up the display of the error by removing redundant text.
2018-08-13 12:20:12 -07:00
Risha Mars e63e28e243
Fix tap start/stop button not toggling at the right time (#1432)
Problem:
We depend on the websocketRequestSent bool (renamed to 
tapRequestInProgress in this branch) to determine whether the 
start/stop button says start or stop. However, we don't change 
this value in setState until we open the websocket connection 
(which could take some time). This led to a delay in when you 
press the Start button and when it changes colour.

Solution:
Set the state before waiting for the websocket to open, so the 
button colour changes immediately and the form feels more responsive
2018-08-10 12:12:40 -07:00
Adam Christian f510d7ea08
Changing the statusText to be an object with more fields, then displa… (#1395)
* Changing the statusText to be an object with more fields, then displaying them in the ErrorBanner

Signed-off-by: Adam Christian <adam@buoyant.io>

Refactoring karma tests and propTypes and defaultProps per the code review from @rmars

Signed-off-by: Adam Christian <adam@buoyant.io>

Changing the default message to pass the ServiceMeshTest ErrorBanner assertion

Revert "Changing the default message to pass the ServiceMeshTest ErrorBanner assertion"

This reverts commit 2415b7099b03ad7a8deda9f67218bb531111b3ec.

Fixing the failing karma unit tests because the statusMessage wasn't being properly passed into the component rendering stub context

Signed-off-by: Adam Christian <adam@buoyant.io>

merging master in

Signed-off-by: Adam Christian <adam@buoyant.io>

* Export api error type independently from ApiHelpers

Signed-off-by: Adam Christian <adam@buoyant.io>
2018-08-08 15:45:08 -07:00
Risha Mars 5d01779dc0
Tap Web UI: add autocomplete for some authorities (#1409)
Problem:
Currently the web UI's resource autocomplete also lists authorities. 
However you can't tap authorities in this way, you have to use --authority 
in addition to whatever resource you're trying to tap. 
The web UI is confusing as it presents authorities in that list. 
Those authorities should instead be moved to the Authority box in the advanced filter form.

Solution:
* Don't present authorities as options in the Resource dropdowns
* Add authority autocomplete to authority form input

Follow up to @kl in #1391 there is an error when we try to tap an authority
2018-08-07 14:29:02 -07:00
Risha Mars 511549e16d
Add client-side filters to the tap columns in the web UI (#1398)
Add client side filtering to the tap table, so that we can narrow down 
queries while still tapping a whole resource. 

There are two general kinds of filters here:
- filters where the number of possible values is bounded/small and 
we know them (e.g. inbound/outbound, grpc status). here, I've tried to 
hardcode the list of possible options with explanations (see the GRPC status filters)
- filters where the number of possible values can be very large (e.g. paths)
here, I've generated the list of options as we process the incoming data. 
I also periodically delete the oldest filter option so the list of filters 
doesn't grow unbounded

Filters added:
- GRPC status code filters
- http status filters
- path filters
- scheme filters
- tls, destination and source filters
2018-08-06 12:31:10 -07:00
Risha Mars 0e6c0a2f3b
Tap: Make use of the Web UI to render tap events in a table (#1391)
* Make use of the Web UI to render tap events in a table

- Return JSON tap events instead of the command line output
- Experiment with a different way of rendering the EventList
- changed the default width back to 100% of the screen because this 
table does not look great squished
2018-08-03 13:45:04 -07:00
Risha Mars fef896011f Add more filters to the web UI tap form (#1371)
* Update ant to 3.7.2
* Add autocomplete of namespaces/resources to Tap in web ui
  * Add form fields for authority/path/method/rps/scheme
  * Add the ability to clear error messages to the error banner
* Add error listener to ws object
2018-07-31 15:48:53 -07:00
Risha Mars ec3c861743
Enable Tap from the Web UI (#1356)
Adds a tap endpoint in the web api that communicates with the dashboard 
via websockets.
I've moved a bunch of code from the cli tap.go into utils so that the code 
can be shared between web and CLI. I think we should consider making the 
display more suited to web, but in the short term, reusing the CLI's 
rendering of tap events works.

Adds a Tap page in the Web UI that you can use to make tap requests. 
The form currently only allows you to enter a resource and namespace, 
other filters coming in a follow-up branch.
2018-07-24 14:23:42 -04:00