<!--
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 Flink Web Dashboard

The web dashboard is work in progress towards the new Flink runtime monitor. In particular, it will
provide the following missing features of the current web dashboard:

 - Live progress monitoring (via live accumulators)
 - A graph view of the program, as it is executed.
 - A REST style API to access the status of individual jobs.
 - A more modular design

The dashboard listens at `http://localhost:8081`.

The new web dashboard is work in progress. It starts an HTTP server (by default at port 8081)
that serves the new web pages and additional background requests.

## Server Backend

The server side of the dashboard is implemented using [Netty](http://netty.io) with
[Netty Router](https://github.com/sinetja/netty-router) for REST paths.
The framework has very lightweight dependencies.

The code is regular Java code built via Maven. To add additional request handlers, follow the
example of the `org.apache.flink.runtime.webmonitor.handlers.JobSummaryHandler`.


## Dashboard Frontend 

The web dashboard is implemented using *Angular*. The dashboard build infrastructure uses *node.js*.


### Preparing the Build Environment

Depending on your version of Linux, Windows or MacOS, you may need to manually install *node.js*



#### Ubuntu Linux

Install *node.js* by following [these instructions](https://nodejs.org/en/download/).

Verify that the installed version is at least *18.19.1*, via `node --version`.


#### MacOS

First install *brew* by following [these instructions](http://brew.sh/).

Install *node.js* via:

```
brew install node
```

### Building

The build process downloads all requires libraries via the *node.js* package management tool (*npm*)
The final build tool is *@angular/cli*.

```
cd flink-runtime-web/web-dashboard
npm install
npm run build
```

The dashboard code is under `/src`. The result of the build process is under `/web`.

### Developing

When developing the dashboard, every change needs to recompile the files and update the server:

```
cd flink-runtime-web/web-dashboard
npm run build
cd ../../flink-dist
mvn -DskipTests clean package
```

To simplify continuous development, one can use a *standalone proxy server*, together with automatic
re-compilation:

1. Start the proxy server via `npm run proxy` (You can modify the proxy target in the `proxy.conf.json`, the default proxy target is `localhost:8081`)
2. Access the dashboard at [`http://localhost:4200`](http://localhost:4200)

### CodeStyle & Lint

> Tips: Before committing, make sure you've run `npm run lint-staged` and that no errors are reported.

```bash
$ npm run lint
```

### How to update the NOTICE
> Tip: If you've made a modification to any of the dependencies, make sure you've run `dev/generate_notice` before committing to update the `NOTICE` file.

```bash
./web-dashboard/dev/generate_notice.sh
```

### Dependency

- Framework: [Angular](https://angular.dev)
- CLI Tools: [Angular CLI](https://angular.dev/tools/cli)
- UI Components: [NG-ZORRO](https://github.com/NG-ZORRO/ng-zorro-antd)
