Skip to main content
The FlowX Reporting solution provides data analytics and visualization capabilities for your FlowX platform. This guide offers step-by-step instructions for setting up and configuring all components of the reporting system. The reporting solution consists of three main components:
  • 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-runtime and integration-designer databases, 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-runtime and integration-designer, each with its own user (typically app-runtime and integration-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.
Create a separate MongoDB user for each of the two databases, inside the database it reads. The plugin’s connection string carries no authSource, so each connection authenticates against the database it targets. A single user created in a shared authentication database fails to authenticate.

Reporting plugin helm chart configuration

Configuring the reporting plugin involves several steps:

Installation of Spark Operator

  1. Install the Spark Operator using Helm:
  1. Apply RBAC configurations:
  1. Pull the reporting plugin image from the container registry provisioned for your deployment. Building the image locally is not required.
  2. Update the reporting-image URL in the spark-app.yml file.
  3. Configure the correct database ENV variables in the spark-app.yml file (check them in the above examples with/without webhook).
  4. 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.
Below are the configurable values within the chart values.yml file (with webhook):
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.
The values below are the chart defaults. 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, set WORKSPACE_ID on the driver and executor to that workspace UUID.

Superset configuration

Detailed Superset Configuration Guide:

Superset configuration

Superset docker image

Refer to Superset Documentation for in-depth information:

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_URL
  • SPRING_DATASOURCE_USERNAME
  • SPRING_DATASOURCE_PASSWORD
Ensure accurate details to prevent startup errors. The Liquibase script manages schema and migrations.

Redis configuration

The following values should be set with the corresponding Redis-related values:
  • SPRING_REDIS_HOST
  • SPRING_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.
Configure AUTH_OAUTH, not AUTH_OID. The older flask-oidc approach is not the configuration FlowX runs and is not what the Superset image is built for.

Image requirements

The Superset image needs authlib 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 to configOverrides 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.
Superset runs behind a proxy-aware configuration. Your ingress must forward the original protocol and host through X-Forwarded-* headers, otherwise the sign-on redirect is built with the wrong scheme and login fails.

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:
The keys in AUTH_ROLES_MAPPING must match the claim exactly. With Full group path ON, the group appears as /superset-admins and a key of superset-admins never matches, leaving every user on the default role.
If your users are federated from another identity provider, a Group Membership mapper emits nothing for them. Federated users are not members of any Keycloak group unless something puts them in one: FlowX’s own IDP federation carries group names in a user attribute instead. You have two options:
  • Map the incoming claim to real Keycloak groups with an Advanced Claim to Group mapper on the federated identity provider, then use the Group Membership mapper above.
  • Or emit the user attribute directly, by replacing the Group Membership mapper with a User Attribute mapper whose token claim name is groups.
Either way, confirm which form actually reaches Superset before writing the AUTH_ROLES_MAPPING keys. Group identifiers from an external provider are often opaque IDs rather than names.
For the full list of provider options, see the Flask-AppBuilder OAuth documentation.
Last modified on August 27, 2026