Meltano 2.0 Migration Guide
Note: This document is still a work in progress. Expect further changes, coming soon.
The following list includes all recommended migration tasks as well as breaking changes in Meltano version 2.0.
Recommended
Migrate to an Adapter-Specific dbt Transformer
If you previously used dbt or dbt-<adapter> (available adapters documentation) Transformer, we recommend migrating to an adapter specific utility plugin.
Install dbt
This is easy to do! Following the instructions from above to discover and install your chosen adapter:
# install adapter-specific dbt, e.g. for snowflake
meltano add dbt-snowflake
Update your dbt_project.yml
Installation of a new Transformer will introduce two important files to your transform/ directory:
- A new
profiles.ymlfile intransform/profiles/<adapter name>/profiles.yml - A new
dbt_project.ymlfile intransform/dbt_project (<adapter name>).yml
The new profiles.yml will only be used by adapter-specific dbt executions (e.g. dbt-snowflake), and can be customized to meet your requirements.
Your existing profiles.yml will remain in use by your existing dbt Transformer plugin (via elt and invoke).
It is likely that the new dbt_project (<adapter name>).yml will contain changes from your previous dbt_project.yml file, especially if you haven't already upgraded to dbt v1.0.
To complete your migration, consolidate dbt_project.yml and dbt_project (<adapter name>).yml into a single file called dbt_project.yml.
As this project file will be used by both dbt and dbt-<adapter> Transformer plugins by default, you must ensure you are running an up-to-date installation of plugin dbt if you intend to use both adapter-specific and legacy dbt installs together (not recommended).
If you make use of Transform plugins, these will continue to work as regular dbt packages. However adding new Transform plugins will currently (tracking at #3304) re-add the legacy dbt Transformer plugin.
To avoid this we recommend adding Transforms as regular packages directly via dbt as per the dbt Packages documentation.
Remove the dbt Transformer plugin and associated files
To remove the legacy dbt Transformer plugin, run:
# remove the transformer `dbt`
meltano remove transformer dbt
# remove the file bundle `dbt`
meltano remove files dbt
Removing a file bundle does not remove any files from your transform/ directory.
Manually remove transform/profile/profiles.yml to complete clean-up (as adapter-specific installs come with their own profiles.yml in transform/profiles/<adapter name>/profiles.yml).
Migrate from orchestrators to utilities
If you have been using Meltano orchestrators to schedule your ELT jobs, we recommend migrating to the new utilities:
Removed
model and dashboard plugin types
These plugin types provided very basic BI capabilities using Meltano UI. However there are already great 3rd party open source BI solutions in this space, such as the newly added Superset plugin.
Meltano model and dashboard plugins have been removed in favour of existing and future 3rd party tools for the same purpose.
transform support in meltano elt
Meltano 2.0 continues to support extract-load (EL) operations with meltano elt. However, for EL+T operations which also need to transform data, please use meltano run.
transform support in Meltano schedules
Meltano 2.0 continues to support extract-load (EL) operations in schedules.
However, for EL+T operations which also need to transform data, please use the new meltano job add command to create a job definition and then specify the new job name in your schedule.
env_aliases in Plugin config
As part of our effort to streamline the configuration experience in Meltano, we are deprecating the env_aliases attribute of plugin definitions.
Previously env_aliases provided two functions:
- Sourcing setting values from the terminal by a name other than the default environment variable (of the form
<PLUGIN_NAME>_<SETTING_NAME>). - Writing setting values into the plugins' runtime environment under an environment variable name other than the default.
For sourcing setting values we encourage users going forward to make use of the default environment variables (of the form <PLUGIN_NAME>_<SETTING_NAME>) for settings in most cases.
These can be conveniently found for a given plugin by running meltano config <plugin> list.
In cases where an environment variable of a name other than the default must be used to source a setting value, Meltano supports referencing in meltano.yml.
For example:
plugins:
extractors:
- name: tap-gitlab
config:
ultimate_license: $GITLAB_API_ULTIMATE_LICENSE
This will take the value from the environment variable GITLAB_API_ULTIMATE_LICENSE and use it configure the tap-gitlab setting named ultimate_license.
For writing setting values into the plugins' runtime environment under an environment variable name other than the default, we support the env: key for setting definitions.
These can be added or overridden in your meltano.yml file. For example:
plugins:
extractors:
- name: tap-gitlab
settings:
- name: ultimate_license
env: GITLAB_API_ULTIMATE_LICENSE
This will create an environment variable called GITLAB_API_ULTIMATE_LICENSE in the plugins' runtime environment with the configured value of the setting ultimate_license.
Updating your Project
Before v2.0 Meltano made use of env_aliases internally and in several common plugins.
To ensure Meltano and those plugins continue to work as expected, references to the deprecated environment variables in your own project should be replaced.
The table below contains details of the env_aliases that have been removed, and the corresponding default setting environment variable to use in each case.
If for any reason you wish to keep sourcing or writing setting values to deprecated aliases, we recommend using the techniques detailed above to replace the functionality formally provided by env_aliases.
| Plugin | Variant | Deprecated | Replacement |
| meltano | MELTANO_LOG_LEVEL | MELTANO_CLI_LOG_LEVEL | |
| MELTANO_LOG_CONFIG | MELTANO_CLI_LOG_CONFIG | ||
| MELTANO_API_HOSTNAME | MELTANO_UI_BIND_HOST | ||
| MELTANO_API_PORT | MELTANO_UI_BIND_PORT | ||
| PORT | MELTANO_UI_BIND_PORT | ||
| WORKERS | MELTANO_UI_WORKERS | ||
| WEB_CONCURRENCY | MELTANO_UI_WORKERS | ||
| FORWARDED_ALLOW_IPS | MELTANO_UI_FORWARDED_ALLOW_IPS | ||
| MELTANO_READONLY | MELTANO_UI_READONLY | ||
| MELTANO_AUTHENTICATION | MELTANO_UI_AUTHENTICATION | ||
| MELTANO_NOTIFICATION | MELTANO_UI_NOTIFICATION | ||
| TAP_ADWORDS_OAUTH_CLIENT_ID | MELTANO_OAUTH_SERVICE_GOOGLE_ADWORDS_CLIENT_ID | ||
| TAP_ADWORDS_OAUTH_CLIENT_SECRET | MELTANO_OAUTH_SERVICE_GOOGLE_ADWORDS_CLIENT_SECRET | ||
| OAUTH_GITLAB_APPLICATION_ID | MELTANO_OAUTH_GITLAB_CLIENT_ID | ||
| OAUTH_GITLAB_SECRET | MELTANO_OAUTH_GITLAB_CLIENT_SECRET | ||
| MELTANO_CLI_TRACKING_ID | MELTANO_TRACKING_IDS_CLI | ||
| MELTANO_UI_TRACKING_ID | MELTANO_TRACKING_IDS_UI | ||
| MELTANO_EMBED_TRACKING_ID | MELTANO_TRACKING_IDS_UI_EMBED | ||
| dbt-bigquery | meltano | DBT_PROFILES_DIR | DBT_BIGQUERY_PROFILES_DIR |
| dbt-postgres | meltano | DBT_PROFILES_DIR | DBT_POSTGRES_PROFILES_DIR |
| dbt-redshift | meltano | DBT_PROFILES_DIR | DBT_REDSHIFT_PROFILES_DIR |
| dbt-snowflake | meltano | DBT_PROFILES_DIR | DBT_SNOWFLAKE_PROFILES_DIR |
| tap-adwords | meltano | OAUTH_GOOGLE_ADWORDS_CLIENT_ID | TAP_ADWORDS_OAUTH_CLIENT_ID |
| OAUTH_GOOGLE_ADWORDS_CLIENT_SECRET | TAP_ADWORDS_OAUTH_CLIENT_SECRET | ||
| OAUTH_GOOGLE_ADWORDS_DEVELOPER_TOKEN | TAP_ADWORDS_DEVELOPER_TOKEN | ||
| singer-io | OAUTH_GOOGLE_ADWORDS_CLIENT_ID | TAP_ADWORDS_OAUTH_CLIENT_ID | |
| OAUTH_GOOGLE_ADWORDS_CLIENT_SECRET | TAP_ADWORDS_OAUTH_CLIENT_SECRET | ||
| OAUTH_GOOGLE_ADWORDS_DEVELOPER_TOKEN | TAP_ADWORDS_DEVELOPER_TOKEN | ||
| tap-bigquery | anelendata | GOOGLE_APPLICATION_CREDENTIALS | TAP_BIGQUERY_CREDENTIALS_PATH |
| tap-bing-ads | singer-io | OAUTH_BING_ADS_CLIENT_ID | TAP_BING_ADS_OAUTH_CLIENT_ID |
| OAUTH_BING_ADS_CLIENT_SECRET | TAP_BING_ADS_OAUTH_CLIENT_SECRET | ||
| OAUTH_BING_ADS_DEVELOPER_TOKEN | TAP_BING_ADS_DEVELOPER_TOKEN | ||
| tap-csv | meltano | TAP_CSV_FILES_DEFINITION | TAP_CSV_CSV_FILES_DEFINITION |
| meltanolabs | TAP_CSV_FILES_DEFINITION | TAP_CSV_CSV_FILES_DEFINITION | |
| tap-gitlab | meltano | GITLAB_API_GROUPS | TAP_GITLAB_GROUPS |
| GITLAB_API_PROJECTS | TAP_GITLAB_PROJECTS | ||
| GITLAB_API_START_DATE | TAP_GITLAB_START_DATE | ||
| GITLAB_API_TOKEN | TAP_GITLAB_PRIVATE_TOKEN | ||
| GITLAB_API_ULTIMATE_LICENSE | TAP_GITLAB_ULTIMATE_LICENSE | ||
| meltanolabs | GITLAB_API_GROUPS | TAP_GITLAB_GROUPS | |
| GITLAB_API_PROJECTS | TAP_GITLAB_PROJECTS | ||
| GITLAB_API_START_DATE | TAP_GITLAB_START_DATE | ||
| GITLAB_API_TOKEN | TAP_GITLAB_PRIVATE_TOKEN | ||
| GITLAB_API_ULTIMATE_LICENSE | TAP_GITLAB_ULTIMATE_LICENSE | ||
| tap-google-analytics | meltano | GOOGLE_ANALYTICS_API_CLIENT_SECRETS | TAP_GOOGLE_ANALYTICS_KEY_FILE_LOCATION |
| GOOGLE_ANALYTICS_API_END_DATE | TAP_GOOGLE_ANALYTICS_END_DATE | ||
| GOOGLE_ANALYTICS_API_OAUTH_ACCESS_TOKEN | TAP_GOOGLE_ANALYTICS_OAUTH_CREDENTIALS_ACCESS_TOKEN | ||
| GOOGLE_ANALYTICS_API_OAUTH_CLIENT_ID | TAP_GOOGLE_ANALYTICS_OAUTH_CREDENTIALS_CLIENT_ID | ||
| GOOGLE_ANALYTICS_API_OAUTH_CLIENT_SECRET | TAP_GOOGLE_ANALYTICS_OAUTH_CREDENTIALS_CLIENT_SECRET | ||
| GOOGLE_ANALYTICS_API_OAUTH_REFRESH_TOKEN | TAP_GOOGLE_ANALYTICS_OAUTH_CREDENTIALS_REFRESH_TOKEN | ||
| GOOGLE_ANALYTICS_API_REPORTS | TAP_GOOGLE_ANALYTICS_REPORTS | ||
| GOOGLE_ANALYTICS_API_START_DATE | TAP_GOOGLE_ANALYTICS_START_DATE | ||
| GOOGLE_ANALYTICS_API_VIEW_ID | TAP_GOOGLE_ANALYTICS_VIEW_ID | ||
| tap-pendo | singer-io | TAP_PENDO_INTEGRATION_KEY | TAP_PENDO_X_PENDO_INTEGRATION_KEY |
| tap-stripe | meltano | STRIPE_ACCOUNT_ID | TAP_STRIPE_ACCOUNT_ID |
| STRIPE_API_KEY | TAP_STRIPE_CLIENT_SECRET | ||
| prratek | STRIPE_API_KEY | TAP_STRIPE_API_KEY | |
| singer-io | STRIPE_ACCOUNT_ID | TAP_STRIPE_ACCOUNT_ID | |
| STRIPE_API_KEY | TAP_STRIPE_CLIENT_SECRET | ||
| target-bigquery | adswerve | GOOGLE_APPLICATION_CREDENTIALS | TARGET_BIGQUERY_CREDENTIALS_PATH |
| target-postgres | datamill-co | PG_ADDRESS | TARGET_POSTGRES_POSTGRES_HOST |
| PG_DATABASE | TARGET_POSTGRES_POSTGRES_DATABASE | ||
| PG_PASSWORD | TARGET_POSTGRES_POSTGRES_PASSWORD | ||
| PG_PORT | TARGET_POSTGRES_POSTGRES_PORT | ||
| PG_SCHEMA | TARGET_POSTGRES_POSTGRES_SCHEMA | ||
| PG_USERNAME | TARGET_POSTGRES_POSTGRES_USERNAME | ||
| TARGET_POSTGRES_DATABASE | TARGET_POSTGRES_POSTGRES_DATABASE | ||
| TARGET_POSTGRES_HOST | TARGET_POSTGRES_POSTGRES_HOST | ||
| TARGET_POSTGRES_PASSWORD | TARGET_POSTGRES_POSTGRES_PASSWORD | ||
| TARGET_POSTGRES_PORT | TARGET_POSTGRES_POSTGRES_PORT | ||
| TARGET_POSTGRES_SCHEMA | TARGET_POSTGRES_POSTGRES_SCHEMA | ||
| TARGET_POSTGRES_SSLCERT | TARGET_POSTGRES_POSTGRES_SSLCERT | ||
| TARGET_POSTGRES_SSLCRL | TARGET_POSTGRES_POSTGRES_SSLCRL | ||
| TARGET_POSTGRES_SSLKEY | TARGET_POSTGRES_POSTGRES_SSLKEY | ||
| TARGET_POSTGRES_SSLMODE | TARGET_POSTGRES_POSTGRES_SSLMODE | ||
| TARGET_POSTGRES_SSLROOTCERT | TARGET_POSTGRES_POSTGRES_SSLROOTCERT | ||
| TARGET_POSTGRES_USERNAME | TARGET_POSTGRES_POSTGRES_USERNAME | ||
| meltano | PG_ADDRESS | TARGET_POSTGRES_HOST | |
| PG_DATABASE | TARGET_POSTGRES_DBNAME | ||
| PG_PASSWORD | TARGET_POSTGRES_PASSWORD | ||
| PG_PORT | TARGET_POSTGRES_PORT | ||
| PG_SCHEMA | TARGET_POSTGRES_SCHEMA | ||
| PG_URL | TARGET_POSTGRES_URL | ||
| PG_USERNAME | TARGET_POSTGRES_USER | ||
| POSTGRES_DBNAME | TARGET_POSTGRES_DBNAME | ||
| POSTGRES_HOST | TARGET_POSTGRES_HOST | ||
| POSTGRES_PASSWORD | TARGET_POSTGRES_PASSWORD | ||
| POSTGRES_PORT | TARGET_POSTGRES_PORT | ||
| POSTGRES_SCHEMA | TARGET_POSTGRES_SCHEMA | ||
| POSTGRES_URL | TARGET_POSTGRES_URL | ||
| POSTGRES_USER | TARGET_POSTGRES_USER | ||
| transferwise | PG_ADDRESS | TARGET_POSTGRES_HOST | |
| PG_DATABASE | TARGET_POSTGRES_DBNAME | ||
| PG_PASSWORD | TARGET_POSTGRES_PASSWORD | ||
| PG_PORT | TARGET_POSTGRES_PORT | ||
| PG_SCHEMA | TARGET_POSTGRES_DEFAULT_TARGET_SCHEMA | ||
| PG_USERNAME | TARGET_POSTGRES_USER | ||
| target-redshift | transferwise | AWS_ACCESS_KEY_ID | TARGET_REDSHIFT_AWS_ACCESS_KEY_ID |
| AWS_PROFILE | TARGET_REDSHIFT_AWS_PROFILE | ||
| AWS_SECRET_ACCESS_KEY | TARGET_REDSHIFT_AWS_SECRET_ACCESS_KEY | ||
| AWS_SESSION_TOKEN | TARGET_REDSHIFT_AWS_SESSION_TOKEN | ||
| TARGET_REDSHIFT_SCHEMA | TARGET_REDSHIFT_DEFAULT_TARGET_SCHEMA | ||
| target-snowflake | datamill-co | SF_ACCOUNT | TARGET_SNOWFLAKE_SNOWFLAKE_ACCOUNT |
| SF_DATABASE | TARGET_SNOWFLAKE_SNOWFLAKE_DATABASE | ||
| SF_PASSWORD | TARGET_SNOWFLAKE_SNOWFLAKE_PASSWORD | ||
| SF_ROLE | TARGET_SNOWFLAKE_SNOWFLAKE_ROLE | ||
| SF_SCHEMA | TARGET_SNOWFLAKE_SNOWFLAKE_SCHEMA | ||
| SF_USER | TARGET_SNOWFLAKE_SNOWFLAKE_USERNAME | ||
| SF_WAREHOUSE | TARGET_SNOWFLAKE_SNOWFLAKE_WAREHOUSE | ||
| TARGET_SNOWFLAKE_ACCOUNT | TARGET_SNOWFLAKE_SNOWFLAKE_ACCOUNT | ||
| TARGET_SNOWFLAKE_DATABASE | TARGET_SNOWFLAKE_SNOWFLAKE_DATABASE | ||
| TARGET_SNOWFLAKE_PASSWORD | TARGET_SNOWFLAKE_SNOWFLAKE_PASSWORD | ||
| TARGET_SNOWFLAKE_ROLE | TARGET_SNOWFLAKE_SNOWFLAKE_ROLE | ||
| TARGET_SNOWFLAKE_SCHEMA | TARGET_SNOWFLAKE_SNOWFLAKE_SCHEMA | ||
| TARGET_SNOWFLAKE_USERNAME | TARGET_SNOWFLAKE_SNOWFLAKE_USERNAME | ||
| TARGET_SNOWFLAKE_USERNAME | TARGET_SNOWFLAKE_SNOWFLAKE_USERNAME | ||
| TARGET_SNOWFLAKE_WAREHOUSE | TARGET_SNOWFLAKE_SNOWFLAKE_WAREHOUSE | ||
| meltano | SF_ACCOUNT | TARGET_SNOWFLAKE_ACCOUNT | |
| SF_DATABASE | TARGET_SNOWFLAKE_DATABASE | ||
| SF_PASSWORD | TARGET_SNOWFLAKE_PASSWORD | ||
| SF_ROLE | TARGET_SNOWFLAKE_ROLE | ||
| SF_SCHEMA | TARGET_SNOWFLAKE_SCHEMA | ||
| SF_USER | TARGET_SNOWFLAKE_USERNAME | ||
| SF_WAREHOUSE | TARGET_SNOWFLAKE_WAREHOUSE | ||
| SNOWFLAKE_ACCOUNT | TARGET_SNOWFLAKE_ACCOUNT | ||
| SNOWFLAKE_DATABASE | TARGET_SNOWFLAKE_DATABASE | ||
| SNOWFLAKE_PASSWORD | TARGET_SNOWFLAKE_PASSWORD | ||
| SNOWFLAKE_ROLE | TARGET_SNOWFLAKE_ROLE | ||
| SNOWFLAKE_SCHEMA | TARGET_SNOWFLAKE_SCHEMA | ||
| SNOWFLAKE_USERNAME | TARGET_SNOWFLAKE_USERNAME | ||
| SNOWFLAKE_WAREHOUSE | TARGET_SNOWFLAKE_WAREHOUSE | ||
| transferwise | SF_ACCOUNT | TARGET_SNOWFLAKE_ACCOUNT | |
| SF_DATABASE | TARGET_SNOWFLAKE_DBNAME | ||
| SF_PASSWORD | TARGET_SNOWFLAKE_PASSWORD | ||
| SF_ROLE | TARGET_SNOWFLAKE_SNOWFLAKE_ROLE | ||
| SF_SCHEMA | TARGET_SNOWFLAKE_DEFAULT_TARGET_SCHEMA | ||
| SF_USER | TARGET_SNOWFLAKE_USER | ||
| SF_WAREHOUSE | TARGET_SNOWFLAKE_WAREHOUSE | ||
| TARGET_SNOWFLAKE_DATABASE | TARGET_SNOWFLAKE_DBNAME | ||
| TARGET_SNOWFLAKE_SCHEMA | TARGET_SNOWFLAKE_DEFAULT_TARGET_SCHEMA | ||
| TARGET_SNOWFLAKE_USERNAME | TARGET_SNOWFLAKE_USER | ||
| target-sqlite | meltano | SQLITE_DATABASE | TARGET_SQLITE_DATABASE |
| meltanolabs | SQLITE_DATABASE | TARGET_SQLITE_DATABASE |
CLI and API Changes
Use --state-id instead of --job_id
In 2.0, many references to "Job ID" in our code and docs were changed to the more accurate name of "State ID".
If you are explicitly providing a --job_id option to any scripted or otherwise automated CLI workflows, these commands should be updated to use the --state-id option instead.
Schedule list format changes
If you have custom orchestrator integrations based on the meltano schedule list command, you will need to make adjustments to handle a new output format.
With the addition of support for scheduled jobs in 2.0, the schema output of meltano schedule list --format=json has changed.
It now includes a top level field schedules and two nested array fields job and elt which hold and describe their respective schedules.
ex:
{
"schedules": {
"job": [
{
"name": "daily-doit",
"interval": "@daily",
"cron_interval": "0 0 * * *",
"env": {},
"job": {
"name": "simple-demo",
"tasks": [
"tap-gitlab hide-gitlab-secrets target-jsonl",
"tap-gitlab target-csv"
]
}
}
],
"elt": [
{legacy elt schedule entry remains unchanged}, ...
]
}
}