- Reporting Plugin: Extracts and processes data from the FlowX Engine
- Spark Application: Handles data transformation and loading operations
- Apache Superset: Provides the visualization interface and dashboard capabilities
Dependencies
The reporting plugin, available as a Docker image, requires the following dependencies:- PostgreSQL or Oracle: Dedicated instance for reporting data storage.
- MongoDB: Read access to the
app-runtimeandintegration-designerdatabases, which the plugin reads to resolve app versions and active builds. - Reporting-plugin Helm Chart:
- Utilizes a Spark Application to extract data from the FLOWX.AI Engine database and populate the Reporting plugin database.
- Utilizes Spark Operator. For more information, see the Spark Operator documentation.
- Superset:
- Requires a dedicated PostgreSQL database for its operation.
- Utilizes Redis for efficient caching.
- Exposes its user interface via an ingress.
Prerequisites
Before starting the installation, ensure you have:- Kubernetes cluster with Helm installed
- Access to the source and destination databases, each on PostgreSQL or Oracle:
- FlowX Engine database (source)
- Reporting database (destination)
- A PostgreSQL database for Superset metadata
- Access to the MongoDB databases
app-runtimeandintegration-designer, each with its own user (typicallyapp-runtimeandintegration-designer) - Read access is enough on the engine database and on both MongoDB databases. Only the reporting database is written to.
- Access to the container registry that serves your reporting plugin image and Helm chart
- Redis instance for Superset caching
- Ingress controller for exposing Superset UI
The engine and reporting databases each run on PostgreSQL or Oracle. Set
ENGINE_DATABASE_TYPE and REPORTING_DATABASE_TYPE to postgres or oracle to match. The runtime and integration databases are always MongoDB.On Oracle, the plugin reads the UUID columns as RAW(16), which is what the FlowX Liquibase scripts create.Reporting plugin helm chart configuration
Configuring the reporting plugin involves several steps:Installation of Spark Operator
- Install the Spark Operator using Helm:
- Apply RBAC configurations:
- Pull the reporting plugin image from the container registry provisioned for your deployment. Building the image locally is not required.
-
Update the
reporting-imageURL in thespark-app.ymlfile. -
Configure the correct database ENV variables in the
spark-app.ymlfile (check them in the above examples with/without webhook). - Deploy the application:
Spark Operator deployment options
Without webhook
For deployments without a webhook, manage secrets and environmental variables for security:NOTE: Passwords are currently set as plain strings, which is not secure practice in a production environment.
With webhook
When using the webhook, employ environmental variables with secrets for a balanced security approach:In Kubernetes-based Spark deployments managed by the Spark Operator, you can define the sparkApplication configuration to customize the behavior, resources, and environment for both the driver and executor components of Spark jobs. The driver section allows fine-tuning of parameters specifically pertinent to the driver part of the Spark application.
sparkApplication.sparkVersion has no default in the chart, so it must be set explicitly. It has to match the Spark version in the plugin image.
Driver cores and memory are the values to raise if the extraction job does not finish inside the refresh interval.
Executor sizing is not driven by the chart values. The plugin builds its Spark session from the
spark.conf file in the image, which ships spark.executor.cores = 2, spark.executor.memory = 1024m and spark.executor.inst.max = 5, the ceiling on the number of executors. It then recalculates the executor count at every run from the volume of data to be processed: one executor for small deltas, up to that ceiling for large ones.Limiting the reporting scope
By default the plugin reports on every workspace. To restrict it to a single workspace, setWORKSPACE_ID on the driver and executor to that workspace UUID.
Superset configuration
Detailed Superset Configuration Guide:Superset configuration
Superset docker image
Superset documentation
Post-installation steps
After installation, perform the following essential configurations:Datasource configuration
For document-related data storage, configure these environment variables:SPRING_DATASOURCE_URLSPRING_DATASOURCE_USERNAMESPRING_DATASOURCE_PASSWORD
Redis configuration
The following values should be set with the corresponding Redis-related values:SPRING_REDIS_HOSTSPRING_REDIS_PORT
Superset single sign-on
Superset authenticates users against your identity provider over OpenID Connect, using Flask-AppBuilder’s OAuth support, and maps a claim from the token to a Superset role at every login.Image requirements
The Superset image needsauthlib for OAuth and psycopg2-binary for its PostgreSQL metadata database. Build them into the image rather than installing them at pod start, so the cluster needs no access to a public package index.
Superset configuration
Add the following toconfigOverrides in your Superset values, replacing the provider details with your own:
role_keys is what AUTH_ROLES_MAPPING matches on, so the group names returned by your identity provider have to match the keys in that map. A user who is in none of the mapped groups gets the role set in AUTH_USER_REGISTRATION_ROLE.
SECRET_KEY must be a strong random value, supplied as a Kubernetes secret, and it has to stay stable for the lifetime of the installation. Rotating it invalidates active sessions and any encrypted metadata Superset holds.Identity provider setup
Register a confidential client for Superset using the authorization code flow, then:1
Set the redirect URI
The callback path is
/oauth-authorized/{provider-name}, where the provider name is the name field from OAUTH_PROVIDERS. With the example above, the redirect URI is https://{your-superset-host}/oauth-authorized/keycloak.2
Add the scopes and a group claim
Request
openid email profile, and add a mapper that puts the user’s groups into the user-info response. Superset reads that claim at every login to assign a role, so without it no user gets access beyond the default role.On Keycloak, attach the mapper to the client itself, as described below. Some other providers expose groups only through a dedicated scope, in which case add that scope to client_kwargs.3
Create the access groups
Create one group per Superset role you want to grant and add the members. Map them in
AUTH_ROLES_MAPPING.Group claim on Keycloak
The groups claim comes from a Group Membership mapper on the Superset client, the same mapper type FlowX uses on the platform client. For the step-by-step, see Group membership mapper, and set it as follows:
For the full list of provider options, see the Flask-AppBuilder OAuth documentation.

