2019-01-31 20:26:41 -05:00
<!--
~ Licensed to the Apache Software Foundation (ASF) under one
~ or more contributor license agreements. See the NOTICE file
~ distributed with this work for additional information
~ regarding copyright ownership. The ASF licenses this file
~ to you under the Apache License, Version 2.0 (the
~ "License"); you may not use this file except in compliance
~ with the License. You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing,
~ software distributed under the License is distributed on an
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~ KIND, either express or implied. See the License for the
~ specific language governing permissions and limitations
~ under the License.
-->
# Apache Druid web console
2020-12-08 12:25:14 -05:00
This is the Druid web console that servers as a data management interface for Druid.
2019-01-31 20:26:41 -05:00
2020-12-08 12:25:14 -05:00
## Developing the console
### Getting started
2019-01-31 20:26:41 -05:00
2020-10-03 11:21:44 -04:00
1. You need to be within the `web-console` directory
2019-01-31 20:26:41 -05:00
2. Install the modules with `npm install`
2020-12-08 12:25:14 -05:00
3. Run `npm run compile` to compile the scss files (this usually needs to be done only once)
2020-10-09 10:51:59 -04:00
4. Run `npm start` will start in development mode and will proxy druid requests to `localhost:8888`
2019-08-20 23:40:47 -04:00
**Note:** you can provide an environment variable to proxy to a different Druid host like so: `druid_host=1.2.3.4:8888 npm start`
**Note:** you can provide an environment variable use webpack-bundle-analyzer as a plugin in the build script or like so: `BUNDLE_ANALYZER_PLUGIN='TRUE' npm start`
2019-01-31 20:26:41 -05:00
2019-11-15 22:45:14 -05:00
To try the console in (say) coordinator mode you could run it as such:
`druid_host=localhost:8081 npm start`
2020-12-08 12:25:14 -05:00
### Developing
2019-01-31 20:26:41 -05:00
2020-12-08 12:25:14 -05:00
You should use a TypeScript friendly IDE (such as [WebStorm ](https://www.jetbrains.com/webstorm/ ), or [VS Code ](https://code.visualstudio.com/ )) to develop the web console.
2019-01-31 20:26:41 -05:00
2021-04-22 22:33:03 -04:00
The console relies on [eslint ](https://eslint.org ) (and various plugins), [sass-lint ](https://github.com/sasstools/sass-lint ), and [prettier ](https://prettier.io/ ) to enforce code style. If you are going to do any non-trivial development you should set up your IDE to automatically lint and fix your code as you make changes.
#### Configuring WebStorm
- **Preferences | Languages & Frameworks | JavaScript | Code Quality Tools | ESLint**
2024-03-08 17:36:26 -05:00
2021-04-22 22:33:03 -04:00
- Select "Automatic ESLint Configuration"
- Check "Run eslint --fix on save"
2019-01-31 20:26:41 -05:00
2021-04-22 22:33:03 -04:00
- **Preferences | Languages & Frameworks | JavaScript | Prettier**
- Set "Run for files" to `{**/*,*}.{js,ts,jsx,tsx,css,scss}`
- Check "On code reformat"
- Check "On save"
2019-01-31 20:26:41 -05:00
2021-04-22 22:33:03 -04:00
#### Configuring VS Code
2024-03-08 17:36:26 -05:00
2021-04-22 22:33:03 -04:00
- Install `dbaeumer.vscode-eslint` extension
- Install `esbenp.prettier-vscode` extension
2024-09-30 23:37:03 -04:00
- Select `Open User Settings (JSON)` from the editor commnads (`Ctrl+Shift+P` or `Comand+Shift+P` ) and set the following:
2021-04-22 22:33:03 -04:00
```json
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
}
```
2019-01-31 20:26:41 -05:00
2021-04-22 22:33:03 -04:00
#### Auto-fixing manually
2024-03-08 17:36:26 -05:00
2021-04-22 22:33:03 -04:00
It is also possible to auto-fix and format code without making IDE changes by running the following script:
2020-12-08 12:25:14 -05:00
2021-04-22 22:33:03 -04:00
- `npm run autofix` — run code linters and formatter
2024-03-08 17:36:26 -05:00
2021-04-22 22:33:03 -04:00
You could also run fixers individually:
- `npm run eslint-fix` — run code linter and fix issues
- `npm run sasslint-fix` — run style linter and fix issues
- `npm run prettify` — reformat code and styles
2019-07-16 12:22:12 -04:00
2020-12-08 12:25:14 -05:00
### Updating the list of license files
2019-07-16 12:22:12 -04:00
2020-12-08 12:25:14 -05:00
If you change the dependencies of the console in any way please run `script/licenses` (from the web-console directory).
It will analyze the changes and update the `../licenses` file as needed.
2020-05-13 19:41:04 -04:00
2021-04-22 22:33:03 -04:00
Please be conscious of not introducing dependencies on packages with Apache incompatible licenses.
2020-12-08 12:25:14 -05:00
### Running end-to-end tests
2020-05-13 19:41:04 -04:00
From the web-console directory:
1. Build druid distribution: `script/druid build`
2. Start druid cluster: `script/druid start`
3. Run end-to-end tests: `npm run test-e2e`
4. Stop druid cluster: `script/druid stop`
2020-10-03 11:21:44 -04:00
If you already have a druid cluster running on the standard ports, the steps to build/start/stop a druid cluster can
be skipped.
2020-12-08 12:25:14 -05:00
#### Screenshots for debugging
2020-05-13 19:41:04 -04:00
`e2e-tests/util/debug.ts:saveScreenshotIfError()` is used to save a screenshot of the web console
2020-10-03 11:21:44 -04:00
when the test fails. For example, if `e2e-tests/tutorial-batch.spec.ts` fails, it will create
2020-05-13 19:41:04 -04:00
`load-data-from-local-disk-error-screenshot.png` .
2020-12-08 12:25:14 -05:00
#### Disabling headless mode
2020-05-13 19:41:04 -04:00
2020-10-03 11:21:44 -04:00
Disabling headless mode while running the tests can be helpful. This can be done via the `DRUID_E2E_TEST_HEADLESS`
environment variable, which defaults to `true` .
2020-05-13 19:41:04 -04:00
2021-04-12 12:48:10 -04:00
Like so: `DRUID_E2E_TEST_HEADLESS=false npm run test-e2e`
2020-12-08 12:25:14 -05:00
#### Running against alternate web console
2020-05-13 19:41:04 -04:00
2020-10-03 11:21:44 -04:00
The environment variable `DRUID_E2E_TEST_UNIFIED_CONSOLE_PORT` can be used to target a web console running on a
non-default port (i.e., not port `8888` ). For example, this environment variable can be used to target the
2020-12-08 12:25:14 -05:00
development mode of the web console (started via `npm start` ), which runs on port `18081` .
2021-10-05 13:28:49 -04:00
Like so: `DRUID_E2E_TEST_UNIFIED_CONSOLE_PORT=18081 npm run test-e2e`
#### Running and debugging a single e2e test using Jest and Playwright
2021-10-09 02:02:58 -04:00
- Run - `jest --config jest.e2e.config.js e2e-tests/tutorial-batch.spec.ts`
- Debug - `PWDEBUG=console jest --config jest.e2e.config.js e2e-tests/tutorial-batch.spec.ts`
2021-10-05 13:28:49 -04:00
2020-12-08 12:25:14 -05:00
## Description of the directory structure
As part of this directory:
- `assets/` - The images (and other assets) used within the console
- `e2e-tests/` - End-to-end tests for the console
2022-05-03 15:08:08 -04:00
- `lib/` - A place where keywords and generated docs live.
2020-12-08 12:25:14 -05:00
- `public/` - The compiled destination for the files powering this console
- `script/` - Some helper bash scripts for running this console
- `src/` - This directory (together with `lib` ) constitutes all the source code for this console
## List of non SQL data reading APIs used
```
GET /status
GET /druid/indexer/v1/supervisor?full
POST /druid/indexer/v1/worker
GET /druid/indexer/v1/workers
GET /druid/indexer/v1/tasks
GET /druid/coordinator/v1/loadqueue?simple
GET /druid/coordinator/v1/config
GET /druid/coordinator/v1/metadata/datasources?includeUnused
GET /druid/coordinator/v1/rules
GET /druid/coordinator/v1/config/compaction
GET /druid/coordinator/v1/tiers
```