Superset Configurations
Superset Currency Format Change
To change the currency format in superset you need to configure in number format.
The adaptive format in superset ui it will automatically show with Million and Billion. if you want to change the number format to Crores and Lakhs.
The Path :~ /superset/superset-frontend/packages/superset-ui-core/src/number-format/factories$ vi createSmartNumberFormat.ts
Change the code to below code for Crores and Lakhs.
import { format as d3Format } from 'd3-format';
import NumberFormatter from '../NumberFormatter';
import NumberFormats from '../NumberFormats';
const siFormatter = d3Format(`.3~s`);
const float2PointFormatter = d3Format(`.2~f`);
const float4PointFormatter = d3Format(`.4~f`);
function formatValue(value: number) {
if (value === 0) {
return '0';
}
const absoluteValue = Math.abs(value);
if (absoluteValue >= 10000000) {
return `${float2PointFormatter(value / 10000000)}Cr`;
}
if (absoluteValue >= 100000) {
return `${float2PointFormatter(value / 100000)}L`;
}
if (absoluteValue >= 1000) {
return `${float2PointFormatter(value / 1000)}K`;
}
if (absoluteValue >= 1) {
return float2PointFormatter(value);
}
if (absoluteValue >= 0.001) {
return float4PointFormatter(value);
}
if (absoluteValue > 0.000001) {
return `${float4PointFormatter(value * 1000000)}µ`;
}
return siFormatter(value);
}
export default function createSmartNumberFormatter(
config: {
description?: string;
signed?: boolean;
id?: string;
label?: string;
} = {},
) {
const { description, signed = false, id, label } = config;
const getSign = signed ? (value: number) => (value > 0 ? '+' : '') : () => '';
return new NumberFormatter({
description,
formatFunc: value => `${getSign(value)}${formatValue(value)}`,
id:
id || signed
? NumberFormats.SMART_NUMBER_SIGNED
: NumberFormats.SMART_NUMBER,
label: label ?? 'Adaptive formatter',
});
}
Superset Alert /Report Configuration:
"ALERT_REPORTS"
feature flag must be turned to True.
beat_schedule
in CeleryConfig must contain schedule forreports.scheduler
.At least one of those must be configured, depending on what you want to use:
emails:
SMTP_*
settingsSlack messages:
SLACK_API_TOKEN
Users can customize the email subject by including date code placeholders, which will automatically be replaced with the corresponding UTC date when the email is sent. To enable this functionality, activate the
"DATE_FORMAT_IN_EMAIL_SUBJECT"
feature flag. This enables date formatting in email subjects, preventing all reporting emails from being grouped into the same thread (optional for the reporting feature).Use date codes from strftime.org to create the email subject.
If no date code is provided, the original string will be used as the email subject.
Slack integration
To send alerts and reports to Slack channels, you need to create a new Slack Application on your workspace.
Connect to your Slack workspace, then head to [https://api.slack.com/apps].
Create a new app.
Go to "OAuth & Permissions" section, and give the following scopes to your app:
incoming-webhook
files:write
chat:write
channels:read
groups:read
At the top of the "OAuth and Permissions" section, click "install to workspace".
Select a default channel for your app and continue. (You can post to any channel by inviting your Superset app into that channel).
The app should now be installed in your workspace, and a "Bot User OAuth Access Token" should have been created. Copy that token in the
SLACK_API_TOKEN
variable of yoursuperset_config.py
.Ensure the feature flag
ALERT_REPORT_SLACK_V2
is set to True insuperset_config.py
Restart the service (or run
superset init
) to pull in the new configuration.
Note: when you configure an alert or a report, the Slack channel list takes channel names without the leading '#' e.g. use alerts
instead of #alerts
.
Detailed config
The following configurations need to be added to the superset_config.py
file. This file is loaded when the image runs, and any configurations in it will override the default configurations found in the config.py
.
You can find documentation about each field in the default config.py
in the GitHub repository under superset/config.py.
You need to replace default values with your custom Redis, Slack and/or SMTP config.
Superset uses Celery beat and Celery worker(s) to send alerts and reports.
The beat is the scheduler that tells the worker when to perform its tasks. This schedule is defined when you create the alert or report.
The worker will process the tasks that need to be performed when an alert or report is fired.
In the CeleryConfig
, only the beat_schedule
is relevant to this feature, the rest of the CeleryConfig
can be changed for your needs.
from celery.schedules import crontab
FEATURE_FLAGS = {
"ALERT_REPORTS": True
}
GLOBAL_ASYNC_QUERIES_CACHE_BACKEND = {
"CACHE_TYPE": "RedisCache",
"CACHE_REDIS_HOST": "localhost",
"CACHE_REDIS_PORT": 6379,
"CACHE_REDIS_USER": "",
"CACHE_REDIS_PASSWORD": "",
"CACHE_REDIS_DB": 0,
"CACHE_DEFAULT_TIMEOUT": 300,
"CACHE_REDIS_SENTINELS": [("localhost", 26379)],
"CACHE_REDIS_SENTINEL_MASTER": "mymaster",
"CACHE_REDIS_SENTINEL_PASSWORD": None,
"CACHE_REDIS_SSL": False, # True or False
"CACHE_REDIS_SSL_CERTFILE": None,
"CACHE_REDIS_SSL_KEYFILE": None,
"CACHE_REDIS_SSL_CERT_REQS": "required",
"CACHE_REDIS_SSL_CA_CERTS": None,
}
class CeleryConfig: # pylint: disable=too-few-public-methods
broker_url = "sqla+sqlite:///celerydb.sqlite"
imports = (
"superset.sql_lab",
"superset.tasks.scheduler",
"superset.tasks.thumbnails",
"superset.tasks.cache",
"superset.tasks.slack",
)
result_backend = "db+sqlite:///celery_results.sqlite"
worker_prefetch_multiplier = 1
task_acks_late = False
task_annotations = {
"sql_lab.get_sql_results": {
"rate_limit": "100/s",
},
}
beat_schedule = {
"reports.scheduler": {
"task": "reports.scheduler",
"schedule": crontab(minute="*", hour="*"),
"options": {"expires": int(CELERY_BEAT_SCHEDULER_EXPIRES.total_seconds())},
},
"reports.prune_log": {
"task": "reports.prune_log",
"schedule": crontab(minute=0, hour=0),
},
}
CELERY_CONFIG: type[CeleryConfig] = CeleryConfig
SCREENSHOT_LOCATE_WAIT = 100
SCREENSHOT_LOAD_WAIT = 600
# Slack configuration
# Slack API token for the superset reports, either string or callable
SLACK_API_TOKEN: Callable[[], str] | str | None = None
SLACK_PROXY = None
SLACK_CACHE_TIMEOUT = int(timedelta(days=1).total_seconds())
# Email configuration
# smtp server configuration
SMTP_HOST = "smtp.gmail.com"
SMTP_STARTTLS = True
SMTP_SSL = False
SMTP_USER = "notification.notifier1@gmail.com"
SMTP_PORT = 587
SMTP_PASSWORD = "password" # noqa: S105
SMTP_MAIL_FROM = "notification.notifier1@gmail.com"
EMAIL_REPORTS_SUBJECT_PREFIX = "CLAIM GENIE" # optional - overwrites default value in config.py of "[Report] "
# WebDriver configuration
# If you use Firefox, you can stick with default values
# If you use Chrome, then add the following WEBDRIVER_TYPE and WEBDRIVER_OPTION_ARGS
WEBDRIVER_TYPE = "chrome"
WEBDRIVER_OPTION_ARGS = [
"--force-device-scale-factor=2.0",
"--high-dpi-support=2.0",
"--headless",
"--disable-gpu",
"--disable-dev-shm-usage",
"--no-sandbox",
"--disable-setuid-sandbox",
"--disable-extensions",
]
# This is for internal use, you can keep http
WEBDRIVER_BASEURL = "http://192.168.0.251:8088"
# When running using docker compose use "http://superset_app:8088'
# This is the link sent to the recipient. Change to your domain, e.g. https://superset.mydomain.com
WEBDRIVER_BASEURL_USER_FRIENDLY = "http://192.168.0.251:8088/"
Disable dry-run mode
Screenshots will be taken but no messages actually sent as long as ALERT_REPORTS_NOTIFICATION_DRY_RUN = True
, its default value in docker/pythonpath_dev/superset_config.py
. To disable dry-run mode and start receiving email/Slack notifications, set ALERT_REPORTS_NOTIFICATION_DRY_RUN
to False
in superset config.
In your Dockerfile
You must install a headless browser, for taking screenshots of the charts and dashboards. Only Firefox and Chrome are currently supported.
If you choose Chrome, you must also change the value of
WEBDRIVER_TYPE
to"chrome"
in yoursuperset_config.py
.
Note: All the components required (Firefox headless browser, Redis, Postgres db, celery worker and celery beat) are present in the dev docker image if you are following Installing Superset Locally. All you need to do is add the required config variables described in this guide (See Detailed Config
).
If you are running a non-dev docker image, e.g., a stable release like apache/superset:3.1.0
, that image does not include a headless browser. Only the superset_worker
container needs this headless browser to browse to the target chart or dashboard. You can either install and configure the headless browser - see "Custom Dockerfile" section below - or when deploying via docker compose
, modify your docker-compose.yml
file to use a dev image for the worker container and a stable release image for the superset_app
container.
Note: In this context, a "dev image" is the same application software as its corresponding non-dev image, just bundled with additional tools. So an image like 3.1.0-dev
is identical to 3.1.0
when it comes to stability, functionality, and running in production. The actual "in-development" versions of Superset - cutting-edge and unstable - are not tagged with version numbers on Docker Hub and will display version 0.0.0-dev
within the Superset UI.
File path:-
docker/pythonpath_dev/superset_config.py
FEATURE_FLAGS = {"ALERT_REPORTS": True}
ALERT_REPORTS_NOTIFICATION_DRY_RUN = False
WEBDRIVER_BASEURL = f"http://192.168.0.251:8088/" # When using docker compose baseurl should be http://superset_nginx{ENV{BASEPATH}}/ # noqa: E501
# The base URL for the email report hyperlinks.
WEBDRIVER_BASEURL_USER_FRIENDLY = (
f"http://localhost:8888/{os.environ.get('SUPERSET_APP_ROOT', '/')}/"
)
Custom Dockerfile
If you're running the dev version of a released Superset image, like apache/superset:3.1.0-dev
, you should be set with the above.
But if you're building your own image, or starting with a non-dev version, a webdriver (and headless browser) is needed to capture screenshots of the charts and dashboards which are then sent to the recipient. Here's how you can modify your Dockerfile to take the screenshots either with Firefox or Chrome.
Using Firefox
FROM apache/superset:3.1.0
USER root
RUN apt-get update && \
apt-get install --no-install-recommends -y firefox-esr
ENV GECKODRIVER_VERSION=0.29.0
RUN wget -q https://github.com/mozilla/geckodriver/releases/download/v${GECKODRIVER_VERSION}/geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz && \
tar -x geckodriver -zf geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz -O > /usr/bin/geckodriver && \
chmod 755 /usr/bin/geckodriver && \
rm geckodriver-v${GECKODRIVER_VERSION}-linux64.tar.gz
RUN pip install --no-cache gevent psycopg2 redis
USER superset
Using Chrome
FROM apache/superset:3.1.0
USER root
RUN apt-get update && \
apt-get install -y wget zip libaio1
RUN export CHROMEDRIVER_VERSION=$(curl --silent https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_116) && \
wget -O google-chrome-stable_current_amd64.deb -q http://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROMEDRIVER_VERSION}-1_amd64.deb && \
apt-get install -y --no-install-recommends ./google-chrome-stable_current_amd64.deb && \
rm -f google-chrome-stable_current_amd64.deb
RUN export CHROMEDRIVER_VERSION=$(curl --silent https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_116) && \
wget -q https://storage.googleapis.com/chrome-for-testing-public/${CHROMEDRIVER_VERSION}/linux64/chromedriver-linux64.zip && \
unzip -j chromedriver-linux64.zip -d /usr/bin && \
chmod 755 /usr/bin/chromedriver && \
rm -f chromedriver-linux64.zip
RUN pip install --no-cache gevent psycopg2 redis
USER superset
Don't forget to set WEBDRIVER_TYPE
and WEBDRIVER_OPTION_ARGS
in your config if you use Chrome.