├── dagster ├── stargazer │ ├── assets_modern_data_stack │ │ ├── assets │ │ │ ├── __init__.py │ │ │ └── stargazer.py │ │ ├── __init__.py │ │ ├── repository.py │ │ ├── utils │ │ │ ├── constants.py │ │ │ └── setup_airbyte.py │ │ └── db_io_manager.py │ ├── assets_modern_data_stack_tests │ │ ├── __init__.py │ │ ├── test_assets.py │ │ └── test_repo_loads.py │ ├── setup.cfg │ ├── transformation_dbt │ │ ├── .gitignore │ │ ├── config │ │ │ ├── .user.yml │ │ │ └── profiles.yml │ │ ├── .sqlfluffignore │ │ ├── profiles.yml │ │ ├── packages.yml │ │ ├── models │ │ │ ├── staging │ │ │ │ └── sources.yml │ │ │ └── mart │ │ │ │ ├── mart_gh_stargazer.sql │ │ │ │ ├── schema.yml │ │ │ │ └── mart_gh_cumulative.sql │ │ ├── dbt_project.yml │ │ └── .sqlfluff │ ├── workspace.yaml │ └── setup.py ├── Pipfile └── readme.md ├── transformation_dbt ├── .sqlfluffignore ├── poetry.toml ├── packages.yml ├── readme.md ├── models │ ├── 1-staging │ │ ├── stg_airbyte__actor.sql │ │ ├── stg_airbyte__actor_definition.sql │ │ ├── stg_airbyte__workspace.sql │ │ ├── stg_airbyte__connection.sql │ │ ├── src_airbyte_local_db.yml │ │ ├── stg_airbyte__jobs.sql │ │ └── stg_airbyte__attempts.sql │ ├── 3-mart │ │ ├── mart_sync_success.sql │ │ └── mart_sync_success_day.sql │ └── 2-core │ │ ├── core_airbyte_sync_status.sql │ │ └── intermediate │ │ └── join_cloud_attempts_jobs.sql ├── macros │ └── cross_db_utils │ │ └── json_operations_oss.sql ├── dbt_profiles.yml ├── pyproject.toml ├── dbt_project.yml └── .sqlfluff ├── visualization ├── metabase │ ├── metabase.db.mv.db │ ├── readme.md │ └── metabase.db.trace.db └── rill_data │ └── readme.md ├── .gitignore ├── LICENSE └── README.md /dagster/stargazer/assets_modern_data_stack/assets/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dagster/stargazer/assets_modern_data_stack_tests/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /dagster/stargazer/assets_modern_data_stack_tests/test_assets.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /dagster/stargazer/setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | name = assets_modern_data_stack 3 | -------------------------------------------------------------------------------- /dagster/stargazer/transformation_dbt/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | target/ 3 | dbt_packages/ 4 | logs/ 5 | -------------------------------------------------------------------------------- /dagster/stargazer/transformation_dbt/config/.user.yml: -------------------------------------------------------------------------------- 1 | id: 79b07b4c-491a-4de7-be99-c3d4c8a0cb07 2 | -------------------------------------------------------------------------------- /dagster/stargazer/workspace.yaml: -------------------------------------------------------------------------------- 1 | load_from: 2 | - python_package: assets_modern_data_stack 3 | -------------------------------------------------------------------------------- /transformation_dbt/.sqlfluffignore: -------------------------------------------------------------------------------- 1 | target/ 2 | dbt_packages/ 3 | macros/ 4 | logs/ 5 | .venv 6 | -------------------------------------------------------------------------------- /dagster/stargazer/assets_modern_data_stack/__init__.py: -------------------------------------------------------------------------------- 1 | from .repository import assets_modern_data_stack 2 | -------------------------------------------------------------------------------- /dagster/stargazer/transformation_dbt/.sqlfluffignore: -------------------------------------------------------------------------------- 1 | target/ 2 | dbt_packages/ 3 | macros/ 4 | logs/ 5 | .venv 6 | -------------------------------------------------------------------------------- /visualization/metabase/metabase.db.mv.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airbytehq/open-data-stack/HEAD/visualization/metabase/metabase.db.mv.db -------------------------------------------------------------------------------- /transformation_dbt/poetry.toml: -------------------------------------------------------------------------------- 1 | [virtualenvs] 2 | create = true 3 | in-project = true 4 | 5 | [experimental] 6 | new-installer = true 7 | 8 | [installer] 9 | parallel = true 10 | 11 | -------------------------------------------------------------------------------- /dagster/Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | 8 | [dev-packages] 9 | 10 | [requires] 11 | python_version = "3.10" 12 | -------------------------------------------------------------------------------- /dagster/stargazer/transformation_dbt/profiles.yml: -------------------------------------------------------------------------------- 1 | stargazers: 2 | target: dev 3 | outputs: 4 | dev: 5 | type: postgres 6 | threads: 1 7 | host: localhost 8 | port: 5432 9 | user: postgres 10 | pass: password 11 | dbname: postgres 12 | schema: public 13 | -------------------------------------------------------------------------------- /dagster/stargazer/transformation_dbt/config/profiles.yml: -------------------------------------------------------------------------------- 1 | stargazers: 2 | target: dev 3 | outputs: 4 | dev: 5 | type: postgres 6 | threads: 1 7 | host: localhost 8 | port: 5432 9 | user: postgres 10 | pass: password 11 | dbname: postgres 12 | schema: public 13 | -------------------------------------------------------------------------------- /transformation_dbt/packages.yml: -------------------------------------------------------------------------------- 1 | # add dependencies. these will get pulled during the `dbt deps` process. 2 | 3 | packages: 4 | - package: calogica/dbt_expectations 5 | version: [">=0.5.0", "<0.6.0"] 6 | - package: dbt-labs/codegen 7 | version: 0.7.0 8 | - package: dbt-labs/dbt_external_tables 9 | version: 0.8.0 -------------------------------------------------------------------------------- /dagster/stargazer/transformation_dbt/packages.yml: -------------------------------------------------------------------------------- 1 | # add dependencies. these will get pulled during the `dbt deps` process. 2 | 3 | packages: 4 | - package: calogica/dbt_expectations 5 | version: [">=0.5.0", "<0.6.0"] 6 | - package: dbt-labs/codegen 7 | version: 0.7.0 8 | - package: dbt-labs/dbt_external_tables 9 | version: 0.8.0 -------------------------------------------------------------------------------- /dagster/stargazer/transformation_dbt/models/staging/sources.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | sources: 3 | - name: postgres 4 | database: postgres 5 | schema: public 6 | tables: 7 | - name: stargazers 8 | identifier: _airbyte_raw_stargazers 9 | description: Given stars on GitHub repositories 10 | - name: stargazers_user 11 | description: GitHub users that started the GitHub repo 12 | -------------------------------------------------------------------------------- /dagster/stargazer/transformation_dbt/models/mart/mart_gh_stargazer.sql: -------------------------------------------------------------------------------- 1 | with stargazer as ( 2 | select * 3 | from {{ source('postgres', 'stargazers') }} 4 | ), 5 | users as ( 6 | select * 7 | from {{ source('postgres', 'stargazers_user') }} 8 | ) 9 | 10 | SELECT s.repository , s.starred_at, su.login as user_login 11 | FROM stargazers s left outer join stargazers_user su on s.user_id = su.id 12 | -------------------------------------------------------------------------------- /transformation_dbt/readme.md: -------------------------------------------------------------------------------- 1 | # Airbyte monitoring 2 | 3 | ## setup virtual env, dependencies and dbt profile (attention: if one exists, it will be renamed as `~/.dbt/profiles_backup.yml`: 4 | ```sh 5 | poetry install 6 | poetry shell 7 | task setup_dbt 8 | task setup_dbt_profile1 9 | task setup_dbt_profile2 10 | task run 11 | ```` 12 | 13 | or run dbt manually with: 14 | ```sh 15 | dbt run 16 | ```` 17 | *or `task run`* 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /visualization/metabase/readme.md: -------------------------------------------------------------------------------- 1 | # Install Metabase locally 2 | 3 | 1. [Download Metabase](https://www.metabase.com/start/oss/jar). 4 | 2. place it into `public/visualization/metabase/metabase.jar` 5 | 6 | Make sure you have Java installed and run: 7 | ```sh 8 | cd public/visualizaiton/metabase 9 | java -jar metabase.jar 10 | ``` 11 | 12 | Open Metabase Dashboard at [http://localhost:3000](http://localhost:3000) and navigate to the main dashboard. 13 | -------------------------------------------------------------------------------- /dagster/stargazer/assets_modern_data_stack_tests/test_repo_loads.py: -------------------------------------------------------------------------------- 1 | from assets_modern_data_stack import assets_modern_data_stack 2 | 3 | 4 | def test_repo_can_load(): 5 | assets_modern_data_stack.load_all_definitions() 6 | 7 | # Repo should have only one "default" asset group, which is represented a "__ASSET_JOB" job 8 | assert [job.name for job in assets_modern_data_stack.get_all_jobs()] == [ 9 | "__ASSET_JOB", 10 | "all_assets", 11 | ] 12 | -------------------------------------------------------------------------------- /transformation_dbt/models/1-staging/stg_airbyte__actor.sql: -------------------------------------------------------------------------------- 1 | with source as ( 2 | select * 3 | from {{ source('airbyte_local_db', 'actor') }} 4 | ), 5 | 6 | renamed as ( 7 | select 8 | id as connector_id, 9 | name as connector_name, 10 | tombstone, 11 | actor_type as connector_type, 12 | workspace_id, 13 | configuration, 14 | actor_definition_id as connector_definition_id 15 | 16 | from source 17 | ) 18 | 19 | select * from renamed 20 | -------------------------------------------------------------------------------- /dagster/stargazer/transformation_dbt/models/mart/schema.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | models: 4 | - name: mart_gh_cumulative 5 | description: cumulative count of stars 6 | columns: 7 | - name: repository 8 | - name: starred_at_month 9 | - name: sum_starscustomer_id 10 | - name: cumulative_stargazers 11 | 12 | - name: mart_gh_stargazer 13 | description: This model cleans up customer data 14 | columns: 15 | - name: repository 16 | - name: starred_at 17 | - name: user_login 18 | -------------------------------------------------------------------------------- /transformation_dbt/models/1-staging/stg_airbyte__actor_definition.sql: -------------------------------------------------------------------------------- 1 | with source as ( 2 | select * 3 | from {{ source('airbyte_local_db', 'actor_definition') }} 4 | ), 5 | 6 | renamed as ( 7 | select 8 | id as connector_definition_id, 9 | icon, 10 | name as connector_name, 11 | spec, 12 | actor_type as connector_type, 13 | 14 | source_type as connector_category, 15 | docker_image_tag, 16 | docker_repository, 17 | documentation_url, 18 | 19 | tombstone, 20 | release_date, 21 | release_stage, 22 | resource_requirements 23 | from source 24 | ) 25 | 26 | select * from renamed 27 | -------------------------------------------------------------------------------- /transformation_dbt/models/1-staging/stg_airbyte__workspace.sql: -------------------------------------------------------------------------------- 1 | with source as ( 2 | select * 3 | from {{ source('airbyte_local_db', 'workspace') }} 4 | ), 5 | 6 | 7 | 8 | renamed as ( 9 | select 10 | id as workspace_id, 11 | name as workspace_name, 12 | slug, 13 | email, 14 | tombstone, 15 | customer_id, 16 | notifications, 17 | send_newsletter, 18 | feedback_complete, 19 | first_sync_complete, 20 | display_setup_wizard, 21 | send_security_updates, 22 | initial_setup_complete, 23 | anonymous_data_collection 24 | 25 | from source 26 | ) 27 | 28 | select * from renamed 29 | -------------------------------------------------------------------------------- /transformation_dbt/macros/cross_db_utils/json_operations_oss.sql: -------------------------------------------------------------------------------- 1 | {# 2 | Adapter Macros for the following functions: 3 | - Postgres: json_extract_path_text(, 'path' [, 'path' [, ...}}) -> https://www.postgresql.org/docs/12/functions-json.html 4 | #} 5 | 6 | {# json_extract_text_custom ------------------------------------------------- #} 7 | 8 | {% macro json_extract_text_custom(jcolumn, json_path, dtype) -%} 9 | {%- if dtype %} 10 | json_extract_path_text({{ jcolumn }}::json, '{{ json_path|join("','") }}')::{{ dtype }} 11 | {%- else -%} 12 | json_extract_path_text({{ jcolumn }}::json, '{{ json_path|join("','") }}') 13 | {%- endif -%} 14 | 15 | {%- endmacro %} 16 | -------------------------------------------------------------------------------- /dagster/stargazer/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import find_packages, setup 2 | 3 | setup( 4 | name="assets_modern_data_stack", 5 | packages=find_packages(exclude=["assets_modern_data_stack_tests"]), 6 | package_data={"assets_modern_data_stack": ["transformation_dbt/*"]}, 7 | install_requires=[ 8 | "dagster", 9 | "dagster-airbyte", 10 | "dagster-managed-elements", 11 | "dagster-dbt", 12 | "dagster-postgres", 13 | "pandas", 14 | "numpy", 15 | "scipy", 16 | "dbt-core", 17 | "dbt-postgres", 18 | "aiohttp", 19 | "requests", 20 | "beautifulsoup4", 21 | ], 22 | extras_require={"dev": ["dagit", "pytest", "black"]}, 23 | ) 24 | -------------------------------------------------------------------------------- /transformation_dbt/models/1-staging/stg_airbyte__connection.sql: -------------------------------------------------------------------------------- 1 | with source as ( 2 | select * 3 | from {{ source('airbyte_local_db', 'connection') }} 4 | ), 5 | 6 | renamed as ( 7 | select 8 | id as connection_id, 9 | name, 10 | manual, 11 | prefix, 12 | status, 13 | catalog, 14 | schedule, 15 | source_id, 16 | destination_id, 17 | namespace_format, 18 | namespace_definition, 19 | 20 | resource_requirements, 21 | 22 | {{ json_extract_text_custom('schedule', 'timeUnit') }} as time_unit, 23 | {{ json_extract_text_custom('schedule', 'units', 'integer') }} as units 24 | 25 | from source 26 | ) 27 | 28 | select * from renamed 29 | -------------------------------------------------------------------------------- /dagster/stargazer/transformation_dbt/models/mart/mart_gh_cumulative.sql: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | with stargazer as ( 5 | select * 6 | from {{ source('postgres', 'stargazers') }} 7 | ), 8 | users as ( 9 | select * 10 | from {{ source('postgres', 'stargazers_user') }} 11 | ), 12 | 13 | 14 | per_month as ( 15 | SELECT repository , to_char(s.starred_at , 'YYYY-MM') as starred_at_month, count(*) as sum_stars 16 | FROM stargazers s left outer join users su on s.user_id = su.id 17 | group by repository,to_char(s.starred_at , 'YYYY-MM') 18 | ) 19 | 20 | SELECT repository, starred_at_month, sum_stars 21 | , sum(s.sum_stars) over (partition by repository order by starred_at_month) as cumulative_stargazers 22 | 23 | FROM per_month s 24 | group by repository, starred_at_month, sum_stars 25 | order by repository, starred_at_month 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | .idea 3 | .vscode 4 | *.iml 5 | *.swp 6 | .DS_Store 7 | .dockerversions 8 | .classpath 9 | .project 10 | .settings 11 | .vscode 12 | 13 | build 14 | 15 | # Secrets 16 | secrets 17 | 18 | # Python 19 | *.egg-info 20 | __pycache__ 21 | .pyc 22 | .eggs 23 | .venv 24 | .mypy_cache 25 | .ipynb_checkpoints 26 | *.ipynb 27 | .pytest_ 28 | 29 | # Python unit test / coverage reports 30 | htmlcov/ 31 | .tox/ 32 | .nox/ 33 | .coverage 34 | .coverage.* 35 | .cache 36 | nosetests.xml 37 | coverage.xml 38 | *.cover 39 | *.py,cover 40 | .hypothesis/ 41 | .pytest_cache/ 42 | cover/ 43 | 44 | # airbyte 45 | airbyte/run/ 46 | 47 | #dbt 48 | transformation_dbt/dbt_packages/ 49 | transformation_dbt/logs/ 50 | transformation_dbt/target/ 51 | transformation_dbt/profiles.yml 52 | 53 | 54 | # open stack project 55 | visualization/metabase/plugins 56 | visualization/metabase/metabase.jar 57 | -------------------------------------------------------------------------------- /dagster/stargazer/assets_modern_data_stack/repository.py: -------------------------------------------------------------------------------- 1 | from dagster_airbyte import airbyte_resource 2 | from dagster_dbt import dbt_cli_resource 3 | 4 | from dagster import ( 5 | repository, 6 | with_resources, 7 | ) 8 | 9 | # from . import assets 10 | from .db_io_manager import db_io_manager 11 | from .utils.constants import DBT_CONFIG, POSTGRES_CONFIG 12 | from .assets.stargazer import airbyte_assets, dbt_assets # , metabase_dashboard 13 | 14 | 15 | @repository 16 | def assets_modern_data_stack(): 17 | return [ 18 | airbyte_assets, 19 | with_resources( 20 | dbt_assets, # load_assets_from_package_module(assets), 21 | resource_defs={ 22 | "dbt": dbt_cli_resource.configured(DBT_CONFIG), 23 | "db_io_manager": db_io_manager.configured(POSTGRES_CONFIG), 24 | }, 25 | ), 26 | # metabase_dashboard, 27 | ] 28 | -------------------------------------------------------------------------------- /dagster/stargazer/assets_modern_data_stack/utils/constants.py: -------------------------------------------------------------------------------- 1 | from dagster_postgres.utils import get_conn_string 2 | from dagster._utils import file_relative_path 3 | 4 | 5 | # AIRBYTE_CONFIG = {"host": "localhost", "port": "8000"} 6 | DBT_PROJECT_DIR = file_relative_path(__file__, "../../transformation_dbt") 7 | DBT_PROFILES_DIR = file_relative_path(__file__, "../../transformation_dbt/config") 8 | 9 | 10 | DBT_CONFIG = {"project_dir": DBT_PROJECT_DIR, "profiles_dir": DBT_PROFILES_DIR} 11 | 12 | PG_DESTINATION_CONFIG = { 13 | "username": "postgres", 14 | "password": "password", 15 | "host": "localhost", 16 | "port": 5432, 17 | "database": "postgres", 18 | } 19 | 20 | POSTGRES_CONFIG = { 21 | "con_string": get_conn_string( 22 | username=PG_DESTINATION_CONFIG["username"], 23 | password=PG_DESTINATION_CONFIG["password"], 24 | hostname=PG_DESTINATION_CONFIG["host"], 25 | port=str(PG_DESTINATION_CONFIG["port"]), 26 | db_name=PG_DESTINATION_CONFIG["database"], 27 | ) 28 | } 29 | -------------------------------------------------------------------------------- /transformation_dbt/models/3-mart/mart_sync_success.sql: -------------------------------------------------------------------------------- 1 | with sync_status as (select * from {{ ref('core_airbyte_sync_status') }} ) 2 | 3 | select 4 | source2destination_name, 5 | count(*) as total_attempts, 6 | coalesce(sum(case when attempt_succeeded then 1 else 0 end), 0) as attempt_succeeded, 7 | coalesce(sum(case when attempt_failed then 1 else 0 end), 0) as attempt_failed, 8 | coalesce(sum(case when attempt_succeeded_first_attempt then 1 else 0 end), 0) as attempt_succeeded_first_attempt, 9 | coalesce(sum(case when attempt_succeeded then 1 else 0 end), 0) * 100.0 / count(*) as success_rate, 10 | coalesce(sum(case when attempt_succeeded_first_attempt then 1 else 0 end), 0) * 100.0 / count(*) as success_rate_first_attempt, 11 | coalesce(sum(case when attempt_running then 1 else 0 end), 0) as attempt_running, 12 | sum(attempt_duration) as sum_attempt_duration, 13 | sum(volume_rows) as sum_volume_rows, 14 | sum(volume_mb) as sum_volume_mb 15 | 16 | from sync_status 17 | 18 | group by source2destination_name 19 | -------------------------------------------------------------------------------- /transformation_dbt/models/1-staging/src_airbyte_local_db.yml: -------------------------------------------------------------------------------- 1 | # Source definitions for airbyte raw tables 2 | version: 2 3 | sources: 4 | - name: airbyte_local_db 5 | database: airbyte 6 | schema: public 7 | tables: 8 | - name: actor 9 | description: Each record represents a configured connector. e.g. A Postgres connector configured to pull data from my database. 10 | - name: actor_definition 11 | description: Each record represents a connector that Airbyte supports, e.g. Postgres. This table represents all the connectors that is supported by the current running platform. 12 | - name: attempts 13 | description: Each record in this table represents an attempt. 14 | - name: connection 15 | description: Each record in this table configures a connection (source_id, destination_id, and relevant configuration). 16 | - name: jobs 17 | description: Each record in this table represents a job. 18 | - name: workspace 19 | description: Each record represents a logical workspace for an Airbyte user. In the open-source version of the product, only one workspace is allowed. 20 | -------------------------------------------------------------------------------- /transformation_dbt/models/3-mart/mart_sync_success_day.sql: -------------------------------------------------------------------------------- 1 | with sync_status as (select * from {{ ref('core_airbyte_sync_status') }} ) 2 | 3 | select 4 | source2destination_name, 5 | date(sync_updated) as sync_updated, 6 | count(*) as total_attempts, 7 | coalesce(sum(case when attempt_succeeded then 1 else 0 end), 0) as attempt_succeeded, 8 | coalesce(sum(case when attempt_failed then 1 else 0 end), 0) as attempt_failed, 9 | coalesce(sum(case when attempt_succeeded_first_attempt then 1 else 0 end), 0) as attempt_succeeded_first_attempt, 10 | coalesce(sum(case when attempt_succeeded then 1 else 0 end), 0) * 100.0 / count(*) as success_rate, 11 | coalesce(sum(case when attempt_succeeded_first_attempt then 1 else 0 end), 0) * 100.0 / count(*) as success_rate_first_attempt, 12 | coalesce(sum(case when attempt_running then 1 else 0 end), 0) as attempt_running, 13 | sum(attempt_duration) as sum_attempt_duration, 14 | sum(volume_rows) as sum_volume_rows, 15 | sum(volume_mb) as sum_volume_mb 16 | 17 | from sync_status 18 | 19 | group by source2destination_name, date(sync_updated) 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Airbyte 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Open Data Stack Projects 2 | 3 | This repo contains different example project related to the open data stack. So far it contains these two examples: 4 | - [Airbyte Monitoring with dbt and Metabase](https://airbyte.com/blog/airbyte-monitoring-with-dbt-and-metabase) 5 | - [Configure Airbyte Connections with Python (Dagster)](https://airbyte.com/tutorials/configure-airbyte-with-python-dagster) 6 | - Future potential use-cases: [Series: Building Airbyte’s Data Stack](https://airbyte.com/blog/building-airbytes-data-stack) 7 | 8 | The [Open Data Stack](https://glossary.airbyte.com/term/open-data-stack/) is a better term for the [Modern Data Stack](https://glossary.airbyte.com/term/modern-data-stack/) but focuses on solutions built on open-source and open standards covering the Data Engineering Lifecycle. The open data stack is maintained by everyone using it. Companies can reuse existing battle-tested solutions and build on them instead of reinventing the wheel by re-implementing critical components for each component of the data stack. 9 | 10 | *Open* is so important and often overlooked because it’s what makes the #opendatastack more embeddable with tools from the open data stack such as Airbyte, dbt, Dagster, Superset, and so forth. Letting you integrate them into your services, unlike closed-source services. 11 | -------------------------------------------------------------------------------- /transformation_dbt/dbt_profiles.yml: -------------------------------------------------------------------------------- 1 | 2 | # This file is specific to dbt 3 | # see https://docs.getdbt.com/dbt-cli/configure-your-profile 4 | # This configuration file specifies information about connections to 5 | # your data warehouse(s). The file contains a series of "profiles." 6 | # Profiles specify database credentials and connection information 7 | # 8 | 9 | # Top-level configs that apply to all profiles are set here 10 | config: 11 | partial_parse: true 12 | printer_width: 120 13 | send_anonymous_usage_stats: False 14 | use_colors: True 15 | 16 | # see https://docs.getdbt.com/docs/supported-databases for more details 17 | # 18 | # Commonly, it's helpful to define multiple targets for a profile. For example, 19 | # these targets might be `dev` and `prod`. Whereas the `dev` target points to 20 | # a development schema (eg. dbt_dev), the `prod` schema should point to the 21 | # prod schema (eg. analytics). Analytical/BI tools should point to the 22 | # prod schema so that local development does not interfere with analysis. 23 | # 24 | airbyte_monitoring: 25 | target: dev 26 | outputs: 27 | dev: 28 | type: postgres 29 | threads: 1 30 | host: localhost 31 | port: 5435 32 | user: docker 33 | pass: docker 34 | dbname: airbyte 35 | schema: monitoring 36 | 37 | -------------------------------------------------------------------------------- /dagster/stargazer/assets_modern_data_stack/db_io_manager.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | 3 | from dagster import IOManager, io_manager 4 | 5 | 6 | class DbIOManager(IOManager): 7 | """Sample IOManager to handle loading the contents of tables as pandas DataFrames. 8 | 9 | Does not handle cases where data is written to different schemas for different outputs, and 10 | uses the name of the asset key as the table name. 11 | """ 12 | 13 | def __init__(self, con_string: str): 14 | self._con = con_string 15 | 16 | def handle_output(self, context, obj): 17 | if isinstance(obj, pd.DataFrame): 18 | # write df to table 19 | obj.to_sql(name=context.asset_key.path[-1], con=self._con, if_exists="replace") 20 | elif obj is None: 21 | # dbt has already written the data to this table 22 | pass 23 | else: 24 | raise ValueError(f"Unsupported object type {type(obj)} for DbIOManager.") 25 | 26 | def load_input(self, context) -> pd.DataFrame: 27 | """Load the contents of a table as a pandas DataFrame.""" 28 | model_name = context.asset_key.path[-1] 29 | return pd.read_sql(f"SELECT * FROM {model_name}", con=self._con) 30 | 31 | 32 | @io_manager(config_schema={"con_string": str}) 33 | def db_io_manager(context): 34 | return DbIOManager(context.resource_config["con_string"]) 35 | -------------------------------------------------------------------------------- /transformation_dbt/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "airbyte-monitoring" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Simon Späti "] 6 | 7 | [tool.poetry.dependencies] 8 | python = "^3.9" 9 | dbt-core = "1.2.0" 10 | dbt-postgres="1.2.0" 11 | sqlfluff="1.2.0" 12 | sqlfluff-templater-dbt="1.2.0" 13 | 14 | 15 | [tool.poetry.dev-dependencies] 16 | black = "^22.6.0" 17 | isort = "^5.10.1" 18 | mypy = "^0.971" 19 | pylint = "^2.14.5" 20 | pytest = "^7.1.2" 21 | taskipy = "^1.10.2" 22 | 23 | [build-system] 24 | requires = ["poetry-core>=1.0.0"] 25 | build-backend = "poetry.core.masonry.api" 26 | 27 | [tool.taskipy.tasks] 28 | test = { cmd = "dbt test", help= "run dbt tests for this project" } 29 | update = { cmd = "poetry update", help = "update Python dependencies with Poetry" } 30 | setup_dbt = { cmd = "dbt deps", help = "setup dbt deps" } 31 | setup_dbt_profile1 = { cmd = "mv -n ~/.dbt/profiles.yml ~/.dbt/profiles_backup.yml", help = "setup dbt profile" } 32 | setup_dbt_profile2 = { cmd = "cp dbt_profiles.yml ~/.dbt/profiles.yml", help = "setup dbt profile" } 33 | run = { cmd = "dbt run", help = "run dbt" } 34 | sql_format = { cmd = "sqlfuff fix", help = "sqlfluff fix and format" } 35 | sql_lint = { cmd = "sqlfuff lint", help = "sqlfluff lint" } 36 | 37 | 38 | [tool.black] 39 | line-length = 150 40 | target-version = ['py37'] 41 | include = '\.pyi?$' 42 | exclude = ''' 43 | /( 44 | \.git 45 | | \.hg 46 | | \.mypy_cache 47 | | \.tox 48 | | \.venv 49 | | _build 50 | | buck-out 51 | | build 52 | | dist 53 | | target 54 | )/ 55 | ''' 56 | 57 | [tool.isort] 58 | profile = "black" 59 | force_single_line = "True" 60 | 61 | -------------------------------------------------------------------------------- /dagster/stargazer/transformation_dbt/dbt_project.yml: -------------------------------------------------------------------------------- 1 | name: 'stargazers' 2 | version: '1.0' 3 | config-version: 2 4 | 5 | # This setting configures which "profile" dbt uses for this project. Profiles contain 6 | # database connection information, and should be configured in the ~/.dbt/profiles.yml file 7 | profile: 'stargazers' 8 | 9 | # These configurations specify where dbt should look for different types of files. 10 | # The `source-paths` config, for example, states that source models can be found 11 | docs-paths: ["docs"] 12 | analysis-paths: ["analysis"] 13 | test-paths: ["tests"] 14 | seed-paths: ["seed"] 15 | macro-paths: ["macros"] 16 | 17 | target-path: "target" # directory which will store compiled SQL files 18 | log-path: "logs" # directory which will store DBT logs 19 | 20 | clean-targets: # directories to be removed by `dbt clean` 21 | - "target" 22 | - "logs" 23 | 24 | quoting: 25 | database: true 26 | schema: true 27 | identifier: true 28 | 29 | dispatch: 30 | - macro_namespace: dbt_utils 31 | search_order: ['airbyte_warehouse', 'dbt_utils'] 32 | 33 | vars: 34 | 'dbt_date:time_zone': 'America/Los_Angeles' 35 | get_max_dt_lookback_window: 4 # Set how many days to look back when computing max dt for incremental 36 | 37 | # Using these configurations, you can enable or disable models, change how they 38 | # are materialized, and more! 39 | models: 40 | stargazers: 41 | # When schema changes on models we are building, we should run dbt with --full-refresh flag explicitely 42 | +on_schema_change: "fail" 43 | +materialized: view 44 | staging: 45 | +tags: staging 46 | +materialized: view 47 | +schema: staging 48 | core: 49 | +materialized: view 50 | +schema: core 51 | mart: 52 | +materialized: view 53 | +schema: mart 54 | -------------------------------------------------------------------------------- /transformation_dbt/dbt_project.yml: -------------------------------------------------------------------------------- 1 | name: 'airbyte_monitoring' 2 | version: '1.0' 3 | config-version: 2 4 | 5 | # This setting configures which "profile" dbt uses for this project. Profiles contain 6 | # database connection information, and should be configured in the ~/.dbt/profiles.yml file 7 | profile: 'airbyte_monitoring' 8 | 9 | # These configurations specify where dbt should look for different types of files. 10 | # The `source-paths` config, for example, states that source models can be found 11 | docs-paths: ["docs"] 12 | analysis-paths: ["analysis"] 13 | test-paths: ["tests"] 14 | seed-paths: ["seed"] 15 | macro-paths: ["macros"] 16 | 17 | target-path: "target" # directory which will store compiled SQL files 18 | log-path: "logs" # directory which will store DBT logs 19 | 20 | clean-targets: # directories to be removed by `dbt clean` 21 | - "target" 22 | - "logs" 23 | 24 | quoting: 25 | database: true 26 | schema: true 27 | identifier: true 28 | 29 | dispatch: 30 | - macro_namespace: dbt_utils 31 | search_order: ['airbyte_warehouse', 'dbt_utils'] 32 | 33 | vars: 34 | 'dbt_date:time_zone': 'America/Los_Angeles' 35 | get_max_dt_lookback_window: 4 # Set how many days to look back when computing max dt for incremental 36 | 37 | # Using these configurations, you can enable or disable models, change how they 38 | # are materialized, and more! 39 | models: 40 | airbyte_monitoring: 41 | # When schema changes on models we are building, we should run dbt with --full-refresh flag explicitely 42 | +on_schema_change: "fail" 43 | +materialized: view 44 | 1-staging: 45 | +tags: staging 46 | +materialized: view 47 | +schema: staging 48 | 2-core: 49 | +materialized: view 50 | +schema: core 51 | 3-mart: 52 | +materialized: view 53 | +schema: mart 54 | -------------------------------------------------------------------------------- /visualization/rill_data/readme.md: -------------------------------------------------------------------------------- 1 | # Rill Data 2 | 3 | [Rill Data](https://www.rilldata.com/) one of the latest BI tools and based on DuckDB. It's fully interactive and using DuckDB as a caching layer. 4 | 5 | Unfortunately the data cannot be read live from airbyte postgres, but you can copy the data with a simple comand as CSV and read these with Rill. The commands below show you how you could create a snapshot and vizualize these data. 6 | 7 | 8 | when you followed the tutorial on airbyte.com you have a postgres the airbyte postgres db exposted on `5435` and you can export tables to CSV with: 9 | 10 | Install DuckDB cmd line with: [Docs Installation](https://duckdb.org/docs/installation/). 11 | 12 | 13 | Run DuckDB with: 14 | ```sh 15 | duckdb 16 | ``` 17 | and export data as CSV: 18 | ```sh 19 | INSTALL postgres_scanner; 20 | LOAD postgres_scanner; 21 | COPY(SELECT * FROM postgres_scan('host=127.0.0.1 user=docker dbname=airbyte port=5435 password=docker', 'public', 'jobs')) TO 'jobs.csv' (FORMAT CSV); 22 | ``` 23 | Note: make sure you have the latest [postgres_scanner](https://github.com/duckdblabs/postgres_scanner) version, otherwise you might get `IO Error: Unsupported Postgres type jsonb`. 24 | 25 | 26 | As soon as views are supported, we can export our created mart-views with dbt (does not work as of now): 27 | ```sh 28 | COPY(SELECT * FROM postgres_scan('host=127.0.0.1 user=docker dbname=airbyte port=5435 password=docker', 'monitoring_core', 'core_airbyte_sync_status')) TO 'core_airbyte_sync_status.csv' (FORMAT CSV); 29 | ``` 30 | 31 | Next you can install, load data into rill and start it with: 32 | ```sh 33 | rill import-source jobs.csv 34 | rill start 35 | ``` 36 | and open at [localhost:8080](http://localhost:8080/). 37 | 38 | Note: If you just want to have a quick glance at rill, I added a small export `jobs.csv`, which you could import and test. 39 | -------------------------------------------------------------------------------- /transformation_dbt/models/1-staging/stg_airbyte__jobs.sql: -------------------------------------------------------------------------------- 1 | with source as ( 2 | select * 3 | from {{ source('airbyte_local_db', 'jobs') }} 4 | ), 5 | 6 | renamed as ( 7 | select 8 | cast(id as {{ dbt_utils.type_int() }}) as job_id, 9 | cast(scope as uuid) as connection_id, 10 | 11 | --Unnest config column:, 12 | status, 13 | config_type, 14 | {{ json_extract_text_custom('config', ['sync', 'namespaceDefinition']) }} as namespace_definition, 15 | {{ json_extract_text_custom('config',['sync', 'namespaceFormat']) }} as namespace_format, 16 | {{ json_extract_text_custom('config' ,['sync', 'prefix']) }} as prefix, 17 | 18 | {{ json_extract_text_custom('config', ['sync', 'sourceConfiguration']) }} as source_configuration, 19 | {{ json_extract_text_custom('config', ['sync', 'destinationConfiguration']) }} as destination_configuration, 20 | 21 | {{ json_extract_text_custom('config', ['sync', 'configuredAirbyteCatalog']) }} as configured_airbyte_catalog, 22 | {{ json_extract_text_custom('config', ['sync', 'sourceDockerImage']) }} as source_docker_image, 23 | 24 | {{ json_extract_text_custom('config', ['sync', 'destinationDockerImage']) }} as destination_docker_image, 25 | -- json_array_elements(json_extract_path(config::json, 'sync', 'operationSequence')) as operation_sequence, 26 | {{ json_extract_text_custom('config', ['sync', 'state']) }} as state, 27 | {{ json_extract_text_custom('config', ['sync', 'resourceRequirements']) }} as resource_requirements, 28 | {{ json_extract_text_custom('config', ['sync', 'resourceRequirements', 'cpu_request']) }} as cpu_request, 29 | {{ json_extract_text_custom('config', ['sync', 'resourceRequirements', 'memory_request']) }} as memory_request, 30 | 31 | -- date 32 | cast(created_at as {{ dbt_utils.type_timestamp() }}) as created_at, 33 | cast(updated_at as {{ dbt_utils.type_timestamp() }}) as updated_at, 34 | date(updated_at) as dt 35 | from source 36 | ) 37 | 38 | select * from renamed 39 | -------------------------------------------------------------------------------- /dagster/readme.md: -------------------------------------------------------------------------------- 1 | 2 | # Dagster Orchestration Layer 3 | 4 | This use case is documented step by step on [Configure Airbyte Connections with Python (Dagster)](https://airbyte.com/tutorials/configure-airbyte-with-python-dagster). Below is a summary on how to get started quickly. 5 | 6 | ## Getting started 7 | setup virtual env, dependencies: 8 | ```bash 9 | cd stargazer 10 | pip install -e ".[dev]" 11 | ``` 12 | 13 | If you try to kick off a run immediately, it will fail, as there is no source data to ingest/transform, nor is there an active Airbyte connection. To get everything set up properly, read on. 14 | 15 | ## Set up local Postgres 16 | 17 | We'll use a local postgres instance as the destination for our data. You can imagine the "destination" as a data warehouse (something like Snowflake). 18 | 19 | To get a postgres instance with the required source and destination databases running on your machine, you can run: 20 | 21 | ```bash 22 | docker pull postgres 23 | docker run --name local-postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres 24 | ``` 25 | 26 | ## Set up Airbyte 27 | 28 | Now, you'll want to get Airbyte running locally. The full instructions can be found [here](https://docs.airbyte.com/deploying-airbyte/local-deployment), but if you just want to run some commands (in a separate terminal): 29 | 30 | ```bash 31 | git clone https://github.com/airbytehq/airbyte.git 32 | cd airbyte 33 | docker-compose up 34 | ``` 35 | 36 | Once you've done this, you should be able to go to http://localhost:8000, and see Airbyte's UI. 37 | 38 | ## Set up data and connections 39 | 40 | ```bash 41 | dagster-me check --module assets_modern_data_stack.assets.stargazer:airbyte_reconciler 42 | ``` 43 | 44 | ```bash 45 | dagster-me apply --module assets_modern_data_stack.assets.stargazer:airbyte_reconciler 46 | ``` 47 | ➡️ Make sure you set the environment variable `AIRBYTE_PASSWORD` on your laptop. The default password is `password`. As well as [create](https://github.com/settings/tokens) a token `AIRBYTE_PERSONAL_GITHUB_TOKEN` for fetching the stargazers from the public repositories. 48 | 49 | ## Start the UI of Dagster called Dagit 50 | 51 | To startup the dagster UI run: 52 | ```bash 53 | dagit 54 | ```` 55 | 56 | You'll see the assets of airbyte, dbt that are created automatically in this demo. 57 | 58 | You can click "materialize" inside dagit to sync airbyte connections and run dbt. 59 | 60 | 61 | ## Start the BI Dashbaord with Meltano 62 | 63 | Start it in a separate shell and follow the docs [Metabase Readme](../../visualization/metabase/readme.md). 64 | 65 | 66 | See a step-by-step guide on [Airbyte Blog](https://airbyte.com/tutorials/configure-airbyte-with-python-dagster). 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /transformation_dbt/.sqlfluff: -------------------------------------------------------------------------------- 1 | [sqlfluff] 2 | templater = jinja 3 | verbose = 3 4 | dialect = postgres 5 | 6 | [sqlfluff:templater:dbt] 7 | profile = airbyte_warehouse 8 | 9 | [sqlfluff:indentation] 10 | indented_joins = False 11 | indented_using_on = True 12 | template_blocks_indent = False 13 | 14 | [sqlfluff:templater] 15 | unwrap_wrapped_queries = True 16 | 17 | [sqlfluff:templater:jinja] 18 | apply_dbt_builtins = True 19 | load_macros_from_path = macros 20 | library_path = dbt_packages 21 | 22 | [sqlfluff:templater:jinja:macros] 23 | # Macros provided as builtins for dbt projects 24 | dbt_ref = {% macro ref(model_ref) %}{{model_ref}}{% endmacro %} 25 | dbt_source = {% macro source(source_name, table) %}{{source_name}}_{{table}}{% endmacro %} 26 | dbt_config = {% macro config() %}{% for k in kwargs %}{% endfor %}{% endmacro %} 27 | dbt_var = {% macro var(variable, default='') %}item{% endmacro %} 28 | dbt_is_incremental = {% macro is_incremental() %}True{% endmacro %} 29 | 30 | # Some rules can be configured directly from the config common to other rules. 31 | [sqlfluff:rules] 32 | tab_space_size = 4 33 | max_line_length = 150 34 | indent_unit = space 35 | comma_style = trailing 36 | allow_scalar = True 37 | single_table_references = consistent 38 | unquoted_identifiers_policy = all 39 | 40 | # Some rules have their own specific config. 41 | [sqlfluff:rules:L007] # Keywords 42 | operator_new_lines = after 43 | 44 | [sqlfluff:rules:L010] # Keywords 45 | capitalisation_policy = consistent 46 | 47 | [sqlfluff:rules:L011] # Aliasing 48 | aliasing = explicit 49 | 50 | [sqlfluff:rules:L012] # Aliasing 51 | aliasing = explicit 52 | 53 | [sqlfluff:rules:L014] # Unquoted identifiers 54 | extended_capitalisation_policy = lower 55 | unquoted_identifiers_policy = all 56 | 57 | [sqlfluff:rules:L016] 58 | ignore_comment_lines = False 59 | 60 | [sqlfluff:rules:L026] 61 | force_enable = False 62 | 63 | [sqlfluff:rules:L028] 64 | force_enable = False 65 | 66 | [sqlfluff:rules:L029] # Keyword identifiers 67 | unquoted_identifiers_policy = aliases 68 | quoted_identifiers_policy = none 69 | 70 | [sqlfluff:rules:L030] # Function names 71 | capitalisation_policy = lower 72 | 73 | [sqlfluff:rules:L038] 74 | select_clause_trailing_comma = forbid 75 | 76 | [sqlfluff:rules:L040] # Null & Boolean Literals 77 | capitalisation_policy = lower 78 | 79 | [sqlfluff:rules:L042] 80 | # By default, allow subqueries in from clauses, but not join clauses. 81 | forbid_subquery_in = join 82 | 83 | [sqlfluff:rules:L047] # Consistent syntax to count all rows 84 | prefer_count_1 = False 85 | prefer_count_0 = False 86 | 87 | [sqlfluff:rules:L052] # Semi-colon formatting approach. 88 | multiline_newline = False 89 | require_final_semicolon = False 90 | 91 | [sqlfluff:rules:L054] # GROUP BY/ORDER BY column references. 92 | group_by_and_order_by_style = consistent 93 | 94 | [sqlfluff:rules:L057] # Special characters in identifiers 95 | unquoted_identifiers_policy = all 96 | quoted_identifiers_policy = all 97 | allow_space_in_identifier = False 98 | -------------------------------------------------------------------------------- /dagster/stargazer/transformation_dbt/.sqlfluff: -------------------------------------------------------------------------------- 1 | [sqlfluff] 2 | templater = jinja 3 | verbose = 3 4 | dialect = postgres 5 | 6 | [sqlfluff:templater:dbt] 7 | profile = airbyte_warehouse 8 | 9 | [sqlfluff:indentation] 10 | indented_joins = False 11 | indented_using_on = True 12 | template_blocks_indent = False 13 | 14 | [sqlfluff:templater] 15 | unwrap_wrapped_queries = True 16 | 17 | [sqlfluff:templater:jinja] 18 | apply_dbt_builtins = True 19 | load_macros_from_path = macros 20 | library_path = dbt_packages 21 | 22 | [sqlfluff:templater:jinja:macros] 23 | # Macros provided as builtins for dbt projects 24 | dbt_ref = {% macro ref(model_ref) %}{{model_ref}}{% endmacro %} 25 | dbt_source = {% macro source(source_name, table) %}{{source_name}}_{{table}}{% endmacro %} 26 | dbt_config = {% macro config() %}{% for k in kwargs %}{% endfor %}{% endmacro %} 27 | dbt_var = {% macro var(variable, default='') %}item{% endmacro %} 28 | dbt_is_incremental = {% macro is_incremental() %}True{% endmacro %} 29 | 30 | # Some rules can be configured directly from the config common to other rules. 31 | [sqlfluff:rules] 32 | tab_space_size = 4 33 | max_line_length = 150 34 | indent_unit = space 35 | comma_style = trailing 36 | allow_scalar = True 37 | single_table_references = consistent 38 | unquoted_identifiers_policy = all 39 | 40 | # Some rules have their own specific config. 41 | [sqlfluff:rules:L007] # Keywords 42 | operator_new_lines = after 43 | 44 | [sqlfluff:rules:L010] # Keywords 45 | capitalisation_policy = consistent 46 | 47 | [sqlfluff:rules:L011] # Aliasing 48 | aliasing = explicit 49 | 50 | [sqlfluff:rules:L012] # Aliasing 51 | aliasing = explicit 52 | 53 | [sqlfluff:rules:L014] # Unquoted identifiers 54 | extended_capitalisation_policy = lower 55 | unquoted_identifiers_policy = all 56 | 57 | [sqlfluff:rules:L016] 58 | ignore_comment_lines = False 59 | 60 | [sqlfluff:rules:L026] 61 | force_enable = False 62 | 63 | [sqlfluff:rules:L028] 64 | force_enable = False 65 | 66 | [sqlfluff:rules:L029] # Keyword identifiers 67 | unquoted_identifiers_policy = aliases 68 | quoted_identifiers_policy = none 69 | 70 | [sqlfluff:rules:L030] # Function names 71 | capitalisation_policy = lower 72 | 73 | [sqlfluff:rules:L038] 74 | select_clause_trailing_comma = forbid 75 | 76 | [sqlfluff:rules:L040] # Null & Boolean Literals 77 | capitalisation_policy = lower 78 | 79 | [sqlfluff:rules:L042] 80 | # By default, allow subqueries in from clauses, but not join clauses. 81 | forbid_subquery_in = join 82 | 83 | [sqlfluff:rules:L047] # Consistent syntax to count all rows 84 | prefer_count_1 = False 85 | prefer_count_0 = False 86 | 87 | [sqlfluff:rules:L052] # Semi-colon formatting approach. 88 | multiline_newline = False 89 | require_final_semicolon = False 90 | 91 | [sqlfluff:rules:L054] # GROUP BY/ORDER BY column references. 92 | group_by_and_order_by_style = consistent 93 | 94 | [sqlfluff:rules:L057] # Special characters in identifiers 95 | unquoted_identifiers_policy = all 96 | quoted_identifiers_policy = all 97 | allow_space_in_identifier = False 98 | -------------------------------------------------------------------------------- /transformation_dbt/models/2-core/core_airbyte_sync_status.sql: -------------------------------------------------------------------------------- 1 | 2 | {{ config( 3 | cluster_by = ["connection_id"], 4 | partition_by = {"field": "dt", "data_type": "date", "granularity": "day"} 5 | ) }} 6 | with 7 | 8 | jobs as ( 9 | 10 | select * from {{ ref('stg_airbyte__jobs') }} 11 | 12 | ), 13 | 14 | 15 | 16 | connection as ( 17 | 18 | select * from {{ ref('stg_airbyte__connection') }} 19 | 20 | ), 21 | 22 | actor as ( 23 | 24 | select * from {{ ref('stg_airbyte__actor') }} 25 | 26 | ), 27 | 28 | attempts as ( 29 | 30 | select * from {{ ref('stg_airbyte__attempts') }} 31 | 32 | ), 33 | 34 | attempts_jobs as ( 35 | 36 | select * from {{ ref('join_cloud_attempts_jobs') }} 37 | 38 | ), 39 | 40 | attempt_data as ( 41 | 42 | 43 | select 44 | attempts.sync_unique_key, 45 | jobs.status, 46 | attempts.volume_rows, 47 | attempts.volume_mb, -- a.failure_type, a.failure_origin, a.internal_message, a.external_message, 48 | actor_source.connector_name as source_connector_name, 49 | --sc.connector_type as source_connector_type, 50 | actor_destination.connector_name as destination_connector_name, 51 | jobs.created_at as sync_started, 52 | --dc.connector_type as destination_connector_type, 53 | jobs.updated_at as sync_updated, 54 | attempts_jobs.job_id, 55 | attempts_jobs.config_type, 56 | attempts_jobs.jobs_created_at, 57 | attempts_jobs.event_at, 58 | attempts_jobs.jobs_cpu_request, 59 | attempts_jobs.jobs_memory_request, 60 | attempts_jobs.jobs_source_docker_image, 61 | attempts_jobs.jobs_destination_docker_image, 62 | attempts_jobs.ended_at, 63 | attempts_jobs.standard_sync_summary, 64 | attempts_jobs.attempt_volume_mb, 65 | attempts_jobs.attempt_volume_rows, 66 | attempts_jobs.failure_reasons, 67 | attempts_jobs.count_state_messages_from_source, 68 | attempts_jobs.count_state_messages_from_destination, 69 | attempts_jobs.max_seconds_before_source_state_message_emitted, 70 | attempts_jobs.max_seconds_between_state_message_emit_and_commit, 71 | attempts_jobs.attempt_id, 72 | attempts_jobs.attempt_ended, 73 | attempts_jobs.attempt_duration, 74 | attempts_jobs.attempt_running, 75 | attempts_jobs.attempt_failed, 76 | attempts_jobs.attempt_succeeded_first_attempt, 77 | attempts_jobs.attempt_succeeded, 78 | actor_source.connector_name || '->' || actor_destination.connector_name as source2destination_name 79 | 80 | from jobs 81 | left outer join attempts on jobs.job_id = attempts.job_id 82 | left outer join connection on jobs.connection_id = connection.connection_id 83 | left outer join actor as actor_source on connection.source_id = actor_source.connector_id 84 | left outer join actor as actor_destination on connection.destination_id = actor_destination.connector_id 85 | left outer join attempts_jobs on attempts.sync_unique_key = attempts_jobs.sync_unique_key 86 | 87 | ) 88 | 89 | select * from attempt_data 90 | -------------------------------------------------------------------------------- /transformation_dbt/models/1-staging/stg_airbyte__attempts.sql: -------------------------------------------------------------------------------- 1 | with source as ( 2 | select * 3 | from {{ source('airbyte_local_db', 'attempts') }} 4 | ), 5 | 6 | renamed as ( 7 | select 8 | cast(id as text) as sync_unique_key, 9 | cast(id as {{ dbt_utils.type_int() }}) as id, 10 | cast(job_id as {{ dbt_utils.type_int() }}) as job_id, 11 | output, 12 | status, 13 | log_path, 14 | cast(attempt_number as {{ dbt_utils.type_int() }}) as attempt_id, 15 | temporal_workflow_id, 16 | 17 | json_extract_path(output::json, 'sync', 'standardSyncSummary') as standard_sync_summary, 18 | coalesce({{ json_extract_text_custom('output', ['sync', 'standardSyncSummary', 'recordsSynced'], 'integer') }},0) as volume_rows, 19 | coalesce({{ json_extract_text_custom('output', ['sync', 'standardSyncSummary', 'bytesSynced'], 'float') }} / (1024 * 1024),0) as volume_mb, 20 | 21 | {{ json_extract_text_custom('output', ['sync', 'output_catalog']) }} as number_of_streams, 22 | {{ json_extract_text_custom('output', ['sync', 'standardSyncSummary', 'totalStats', 'sourceStateMessagesEmitted'], 'integer') }} as count_state_messages_from_source, 23 | {{ json_extract_text_custom('output', ['sync', 'standardSyncSummary', 'totalStats', 'destinationStateMessagesEmitted'], 'integer') }} as count_state_messages_from_destination, 24 | {{ json_extract_text_custom('output', ['sync', 'standardSyncSummary', 'totalStats', 'maxSecondsBeforeSourceStateMessageEmitted'], 'integer') }} as max_seconds_before_source_state_message_emitted, 25 | {{ json_extract_text_custom('output', ['sync', 'standardSyncSummary', 'totalStats', 'meanSecondsBeforeSourceStateMessageEmitted'], 'integer') }} as mean_seconds_before_source_state_message_emitted, 26 | {{ json_extract_text_custom('output', ['sync', 'standardSyncSummary', 'totalStats', 'maxSecondsBetweenStateMessageEmittedandCommitted'], 'integer') }} as max_seconds_between_state_message_emit_and_commit, 27 | {{ json_extract_text_custom('output', ['sync', 'standardSyncSummary', 'totalStats', 'meanSecondsBetweenStateMessageEmittedandCommitted'], 'integer') }} as ean_seconds_between_state_message_emit_and_commit, 28 | {{ json_extract_text_custom('failure_summary', ['failures']) }} as failure_reasons, 29 | {{ json_extract_text_custom('failure_summary', ['failures', 'failureType']) }} as failure_type, 30 | {{ json_extract_text_custom('failure_summary', ['failures', 'failureOrigin']) }} as failure_origin, 31 | {{ json_extract_text_custom('failure_summary', ['failures', 'internalMessage']) }} as internal_message, 32 | {{ json_extract_text_custom('failure_summary', ['failures', 'externalMessage']) }} as external_message, 33 | 34 | -- Date 35 | cast(created_at as {{ dbt_utils.type_timestamp() }}) as created_at, 36 | cast(ended_at as {{ dbt_utils.type_timestamp() }}) as ended_at, 37 | cast(updated_at as {{ dbt_utils.type_timestamp() }}) as updated_at, 38 | cast(created_at as {{ dbt_utils.type_timestamp() }}) as loaded_at, 39 | date(updated_at) as dt 40 | 41 | from source 42 | ) 43 | 44 | select * from renamed 45 | -------------------------------------------------------------------------------- /transformation_dbt/models/2-core/intermediate/join_cloud_attempts_jobs.sql: -------------------------------------------------------------------------------- 1 | {{ config( 2 | cluster_by = ["job_id", "attempt_id"], 3 | partition_by = {"field": "dt", "data_type": "date", "granularity": "day"} 4 | ) }} 5 | with 6 | attempts_raw_data as (select * from {{ ref('stg_airbyte__attempts') }} 7 | ), 8 | 9 | jobs_raw_data as (select * from {{ ref('stg_airbyte__jobs') }} 10 | ), 11 | 12 | --in BQ except function is used with `except(loaded_at, failure_reason) 13 | attempts_data as (select distinct 14 | id, 15 | dt, 16 | job_id, 17 | "output", 18 | status, 19 | log_path, 20 | attempt_id, 21 | temporal_workflow_id, 22 | standard_sync_summary::text, 23 | volume_rows, 24 | volume_mb, 25 | sync_unique_key, 26 | count_state_messages_from_source, 27 | count_state_messages_from_destination, 28 | max_seconds_before_source_state_message_emitted, 29 | mean_seconds_before_source_state_message_emitted, 30 | max_seconds_between_state_message_emit_and_commit, 31 | ean_seconds_between_state_message_emit_and_commit, 32 | failure_type, 33 | failure_origin, 34 | internal_message, 35 | external_message, 36 | created_at, 37 | updated_at, 38 | ended_at 39 | from attempts_raw_data 40 | ), 41 | 42 | attempts_incl_row_num as ( select 43 | sync_unique_key, 44 | job_id, 45 | attempt_id, 46 | failure_reasons, 47 | dt, 48 | row_number() over ( 49 | partition by sync_unique_key, job_id, attempt_id, temporal_workflow_id order by dt desc, updated_at desc, ended_at desc, loaded_at desc 50 | ) as seq 51 | from attempts_raw_data 52 | ), 53 | 54 | attempts_failure_reasons_data as ( 55 | select 56 | sync_unique_key, 57 | job_id, 58 | attempt_id, 59 | failure_reasons, 60 | dt 61 | from attempts_incl_row_num 62 | where seq = 1 63 | ), 64 | 65 | jobs_data as ( 66 | select distinct 67 | --except(loaded_at, operation_sequence, cpu_request, memory_request) 68 | job_id, 69 | connection_id, 70 | status, 71 | config_type, 72 | namespace_definition, 73 | namespace_format, 74 | prefix, 75 | source_configuration, 76 | destination_configuration, 77 | configured_airbyte_catalog, 78 | source_docker_image, 79 | destination_docker_image, 80 | state, 81 | resource_requirements, 82 | created_at, 83 | updated_at, 84 | dt, 85 | case when cpu_request = '{}' then null else cpu_request end as cpu_request, 86 | case when memory_request = '{}' then null else memory_request end as memory_request 87 | from jobs_raw_data 88 | ), 89 | 90 | attempt_columns as ( 91 | select 92 | attempts_data.sync_unique_key, 93 | jobs_data.connection_id, 94 | jobs_data.job_id, 95 | jobs_data.config_type, 96 | -- see https://github.com/airbytehq/airbyte/issues/9796#issuecomment-1034909338 97 | attempts_data.dt, 98 | 99 | jobs_data.created_at as jobs_created_at, 100 | 101 | attempts_data.created_at as event_at, 102 | jobs_data.cpu_request as jobs_cpu_request, 103 | 104 | jobs_data.memory_request as jobs_memory_request, 105 | jobs_data.source_docker_image as jobs_source_docker_image, 106 | 107 | jobs_data.destination_docker_image as jobs_destination_docker_image, 108 | attempts_data.ended_at, 109 | 110 | attempts_data.standard_sync_summary, 111 | attempts_data.volume_mb as attempt_volume_mb, 112 | attempts_data.volume_rows as attempt_volume_rows, 113 | attempts_failure_reasons_data.failure_reasons, 114 | 115 | -- Checkpoint Metrics 116 | /* attempts_data.number_of_streams, */ 117 | attempts_data.count_state_messages_from_source, 118 | attempts_data.count_state_messages_from_destination, 119 | attempts_data.max_seconds_before_source_state_message_emitted, 120 | /* attempts_data.mean_seconds_before_source_state_message_emitted, */ 121 | attempts_data.max_seconds_between_state_message_emit_and_commit, 122 | /* attempts_data.mean_seconds_between_state_message_emit_and_commit, */ 123 | 124 | (attempts_data.attempt_id + 1) as attempt_id, 125 | attempts_data.ended_at is not null as attempt_ended, 126 | extract(epoch from (attempts_data.ended_at - attempts_data.created_at)) as attempt_duration, 127 | (attempts_data.status = 'running') as attempt_running, 128 | (attempts_data.status = 'failed') as attempt_failed, 129 | (attempts_data.status = 'succeeded' and attempts_data.attempt_id = 0) as attempt_succeeded_first_attempt, 130 | (attempts_data.status = 'succeeded') as attempt_succeeded 131 | 132 | from attempts_data 133 | 134 | left join attempts_failure_reasons_data 135 | on attempts_data.job_id = attempts_failure_reasons_data.job_id 136 | and attempts_data.attempt_id = attempts_failure_reasons_data.attempt_id 137 | and attempts_data.sync_unique_key = attempts_failure_reasons_data.sync_unique_key 138 | and attempts_data.dt = attempts_failure_reasons_data.dt 139 | 140 | inner join jobs_data 141 | on attempts_data.job_id = jobs_data.job_id 142 | and jobs_data.dt >= attempts_data.dt - interval '4' day 143 | ) 144 | 145 | select * from attempt_columns 146 | -------------------------------------------------------------------------------- /dagster/stargazer/assets_modern_data_stack/assets/stargazer.py: -------------------------------------------------------------------------------- 1 | from dagster import asset 2 | from dagster_airbyte import ( 3 | AirbyteManagedElementReconciler, 4 | airbyte_resource, 5 | AirbyteConnection, 6 | AirbyteSyncMode, 7 | load_assets_from_connections, 8 | ) 9 | from dagster_airbyte.managed.generated.sources import GithubSource 10 | from dagster_airbyte.managed.generated.destinations import ( 11 | LocalJsonDestination, 12 | PostgresDestination, 13 | ) 14 | from typing import List 15 | from dagster_dbt import load_assets_from_dbt_project 16 | 17 | 18 | from bs4 import BeautifulSoup 19 | import os 20 | import requests 21 | 22 | import asyncio 23 | import aiohttp 24 | from ..utils.constants import DBT_PROJECT_DIR 25 | 26 | 27 | AIRBYTE_PERSONAL_GITHUB_TOKEN = os.environ.get( 28 | "AIRBYTE_PERSONAL_GITHUB_TOKEN", "please-set-your-token" 29 | ) 30 | POSTGRES_PASSWORD = os.environ.get("POSTGRES_PASSWORD", "please-set-your-token") 31 | 32 | 33 | airbyte_instance = airbyte_resource.configured( 34 | { 35 | "host": "localhost", 36 | "port": "8000", 37 | "username": "airbyte", 38 | "password": {"env": "AIRBYTE_PASSWORD"}, 39 | } 40 | ) 41 | # two other possibilities to initialize the airbyte instance 42 | # airbyte_assets = load_assets_from_airbyte_project( 43 | # project_dir="../../../../airbyte/test", 44 | # ) 45 | 46 | # airbyte_assets = with_resources( 47 | # [load_assets_from_airbyte_project(project_dir="path/to/airbyte/project")], 48 | # {"airbyte": airbyte_instance}, 49 | # ) 50 | 51 | 52 | async def get(url, session): 53 | try: 54 | # check if status_code is 200 55 | async with session.get(url) as response: 56 | if response.status == 200: 57 | return url 58 | else: 59 | return None 60 | 61 | except Exception as e: 62 | print("Unable to get url {} due to {}.".format(url, e.__class__)) 63 | 64 | 65 | async def check_websites_exists(urls) -> List[str]: 66 | async with aiohttp.ClientSession() as session: 67 | # get url and sessionm if return is not None 68 | tasks = [get(url, session) for url in urls] 69 | results = await asyncio.gather(*tasks) 70 | results = [result for result in results if result is not None] 71 | return results 72 | # print("Finalized all. Return is a list of len {} outputs.".format(len(results))) 73 | 74 | 75 | def get_awesome_repo_list() -> str: 76 | 77 | url = "https://github.com/igorbarinov/awesome-data-engineering" 78 | html = requests.get(url) 79 | soup = BeautifulSoup(html.text, "html.parser") 80 | # parse all links into a list starting with github.com 81 | links = [ 82 | link.get("href") 83 | for link in soup.find_all("a") 84 | if link.get("href").startswith("https://github.com") 85 | ] 86 | # remove links that start with url 87 | links = [ 88 | link 89 | for link in links 90 | if not link.startswith(url) and not link.endswith("github.com") 91 | ] 92 | # remove last slash if there 93 | links = [link[:-1] if link.endswith("/") else link for link in links] 94 | # remove repos without organization 95 | links = [link for link in links if len(link.split("/")) == 5] 96 | # check if links are still existing in parallel to save time 97 | existings_links = asyncio.run(check_websites_exists(links)) 98 | # remove `https://github.com/` from links 99 | links = [link.replace("https://github.com/", "") for link in existings_links] 100 | 101 | # due to timeout limits while airbyte is checking each repo, I limited it here to make this demo work for you 102 | links = links[0:10] 103 | 104 | # return links as a string with blank space as separator 105 | return " ".join(links) 106 | 107 | 108 | gh_awesome_de_list_source = GithubSource( 109 | name="gh_awesome_de_list", 110 | credentials=GithubSource.PATCredentials(AIRBYTE_PERSONAL_GITHUB_TOKEN), 111 | start_date="2020-01-01T00:00:00Z", 112 | repository=get_awesome_repo_list(), # "prometheus/haproxy_exporter", 113 | page_size_for_large_streams=100, 114 | ) 115 | 116 | postgres_destination = PostgresDestination( 117 | name="postgres", 118 | host="localhost", 119 | port=5432, 120 | database="postgres", 121 | schema="public", 122 | username="postgres", 123 | password=POSTGRES_PASSWORD, 124 | ssl_mode=PostgresDestination.Disable(), 125 | ) 126 | 127 | stargazer_connection = AirbyteConnection( 128 | name="fetch_stargazer", 129 | source=gh_awesome_de_list_source, 130 | destination=postgres_destination, 131 | stream_config={"stargazers": AirbyteSyncMode.incremental_append_dedup()}, 132 | normalize_data=True, 133 | ) 134 | 135 | airbyte_reconciler = AirbyteManagedElementReconciler( 136 | airbyte=airbyte_instance, 137 | connections=[stargazer_connection], 138 | ) 139 | 140 | # load airbyte connection from above pythonic definitions 141 | airbyte_assets = load_assets_from_connections( 142 | airbyte=airbyte_instance, 143 | connections=[stargazer_connection], 144 | key_prefix=["postgres"], 145 | ) 146 | 147 | # preparing assets bassed on existing dbt project 148 | dbt_assets = load_assets_from_dbt_project( 149 | project_dir=DBT_PROJECT_DIR, io_manager_key="db_io_manager", key_prefix="postgres" 150 | ) 151 | 152 | 153 | # @asset( 154 | # description="The metabase dashboard where the stargazers are visualized", 155 | # metadata={"dashboard_url": "http://localhost:3000/dashboard/1-airbyte-sync-status"}, 156 | # ) 157 | # def metabase_dashboard(mart_gh_cumulative): 158 | # return "test" 159 | -------------------------------------------------------------------------------- /dagster/stargazer/assets_modern_data_stack/utils/setup_airbyte.py: -------------------------------------------------------------------------------- 1 | # pylint: disable=print-call 2 | """ 3 | A basic script that will create tables in the source postgres database, then automatically 4 | create an Airbyte Connection between the source database and destination database. 5 | """ 6 | # pylint: disable=print-call 7 | import random 8 | from typing import Any, Dict, Mapping 9 | 10 | import numpy as np 11 | import pandas as pd 12 | from dagster_airbyte import AirbyteResource 13 | from dagster_postgres.utils import get_conn_string 14 | 15 | import dagster._check as check 16 | 17 | from .constants import PG_DESTINATION_CONFIG, PG_SOURCE_CONFIG 18 | 19 | # configures the number of records for each table 20 | N_USERS = 100 21 | N_ORDERS = 10000 22 | 23 | 24 | def _safe_request(client: AirbyteResource, endpoint: str, data: Dict[str, object]) -> Mapping[str, Any]: 25 | response = client.make_request(endpoint, data) 26 | assert response, "Request returned null response" 27 | return response 28 | 29 | 30 | def _create_ab_source(client: AirbyteResource) -> str: 31 | workspace_id = _safe_request(client, "/workspaces/list", data={})["workspaces"][0]["workspaceId"] 32 | 33 | # get latest available Postgres source definition 34 | source_defs = _safe_request(client, "/source_definitions/list_latest", data={"workspaceId": workspace_id}) 35 | postgres_definitions = [sd for sd in source_defs["sourceDefinitions"] if sd["name"] == "Postgres"] 36 | if not postgres_definitions: 37 | raise check.CheckError("Expected at least one Postgres source definition.") 38 | source_definition_id = postgres_definitions[0]["sourceDefinitionId"] 39 | 40 | # create Postgres source 41 | source_id = _safe_request( 42 | client, 43 | "/sources/create", 44 | data={ 45 | "sourceDefinitionId": source_definition_id, 46 | "connectionConfiguration": dict(**PG_SOURCE_CONFIG, ssl=False), 47 | "workspaceId": workspace_id, 48 | "name": "Source Database", 49 | }, 50 | )["sourceId"] 51 | print(f"Created Airbyte Source: {source_id}") 52 | return source_id 53 | 54 | 55 | def _create_ab_destination(client: AirbyteResource) -> str: 56 | workspace_id = _safe_request(client, "/workspaces/list", data={})["workspaces"][0]["workspaceId"] 57 | 58 | # get the latest available Postgres destination definition 59 | destination_defs = _safe_request(client, "/destination_definitions/list_latest", data={"workspaceId": workspace_id}) 60 | postgres_definitions = [dd for dd in destination_defs["destinationDefinitions"] if dd["name"] == "Postgres"] 61 | if not postgres_definitions: 62 | raise check.CheckError("Expected at least one Postgres destination definition.") 63 | destination_definition_id = postgres_definitions[0]["destinationDefinitionId"] 64 | 65 | # create Postgres destination 66 | destination_id = _safe_request( 67 | client, 68 | "/destinations/create", 69 | data={ 70 | "destinationDefinitionId": destination_definition_id, 71 | "connectionConfiguration": dict(**PG_DESTINATION_CONFIG, schema="public", ssl=False), 72 | "workspaceId": workspace_id, 73 | "name": "Destination Database", 74 | }, 75 | )["destinationId"] 76 | print(f"Created Airbyte Destination: {destination_id}") 77 | return destination_id 78 | 79 | 80 | def setup_airbyte(): 81 | client = AirbyteResource(host="localhost", port="8000", use_https=False, request_timeout=50) 82 | source_id = _create_ab_source(client) 83 | destination_id = _create_ab_destination(client) 84 | 85 | source_catalog = _safe_request(client, "/sources/discover_schema", data={"sourceId": source_id})["catalog"] 86 | 87 | # create a connection between the new source and destination 88 | connection_id = _safe_request( 89 | client, 90 | "/connections/create", 91 | data={ 92 | "name": "Example Connection", 93 | "sourceId": source_id, 94 | "destinationId": destination_id, 95 | "syncCatalog": source_catalog, 96 | "prefix": "", 97 | "status": "active", 98 | }, 99 | )["connectionId"] 100 | 101 | print(f"Created Airbyte Connection: {connection_id}") 102 | 103 | 104 | def _random_dates(): 105 | 106 | start = pd.to_datetime("2021-01-01") 107 | end = pd.to_datetime("2022-01-01") 108 | 109 | start_u = start.value // 10**9 110 | end_u = end.value // 10**9 111 | 112 | dist = np.random.standard_exponential(size=N_ORDERS) / 10 113 | 114 | clipped_flipped_dist = 1 - dist[dist <= 1] 115 | clipped_flipped_dist = clipped_flipped_dist[:-1] 116 | 117 | if len(clipped_flipped_dist) < N_ORDERS: 118 | clipped_flipped_dist = np.append(clipped_flipped_dist, clipped_flipped_dist[: N_ORDERS - len(clipped_flipped_dist)]) 119 | 120 | return pd.to_datetime((clipped_flipped_dist * (end_u - start_u)) + start_u, unit="s") 121 | 122 | 123 | def add_data(): 124 | con_string = get_conn_string( 125 | username=PG_SOURCE_CONFIG["username"], 126 | password=PG_SOURCE_CONFIG["password"], 127 | hostname=PG_SOURCE_CONFIG["host"], 128 | port=str(PG_SOURCE_CONFIG["port"]), 129 | db_name=PG_SOURCE_CONFIG["database"], 130 | ) 131 | 132 | users = pd.DataFrame( 133 | { 134 | "user_id": range(N_USERS), 135 | "is_bot": [random.choice([True, False]) for _ in range(N_USERS)], 136 | } 137 | ) 138 | 139 | users.to_sql("users", con=con_string, if_exists="replace") 140 | print("Created users table.") 141 | 142 | orders = pd.DataFrame( 143 | { 144 | "user_id": [random.randint(0, N_USERS) for _ in range(N_ORDERS)], 145 | "order_time": _random_dates(), 146 | "order_value": np.random.normal(loc=100.0, scale=15.0, size=N_ORDERS), 147 | } 148 | ) 149 | 150 | orders.to_sql("orders", con=con_string, if_exists="replace") 151 | print("Created orders table.") 152 | 153 | 154 | add_data() 155 | setup_airbyte() 156 | -------------------------------------------------------------------------------- /visualization/metabase/metabase.db.trace.db: -------------------------------------------------------------------------------- 1 | 2022-10-27 11:53:48 jdbc[5]: exception 2 | org.h2.jdbc.JdbcSQLException: Table "DATABASECHANGELOGLOCK" not found; SQL statement: 3 | SELECT COUNT(*) FROM "PUBLIC"."DATABASECHANGELOGLOCK" [42102-197] 4 | 2022-10-27 11:53:50 jdbc[5]: exception 5 | org.h2.jdbc.JdbcSQLException: Column "T.SETTINGS" not found; SQL statement: 6 | select t."SETTINGS" from "PUBLIC"."METABASE_DATABASE" t where 0=1 [42122-197] 7 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 8 | at org.h2.message.DbException.get(DbException.java:179) 9 | at org.h2.message.DbException.get(DbException.java:155) 10 | at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:150) 11 | at org.h2.command.dml.Select.prepare(Select.java:858) 12 | at org.h2.command.Parser.prepareCommand(Parser.java:283) 13 | at org.h2.engine.Session.prepareLocal(Session.java:611) 14 | at org.h2.engine.Session.prepareCommand(Session.java:549) 15 | at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1247) 16 | at org.h2.jdbc.JdbcStatement.executeQuery(JdbcStatement.java:78) 17 | at com.mchange.v2.c3p0.impl.NewProxyStatement.executeQuery(NewProxyStatement.java:327) 18 | at liquibase.precondition.core.ColumnExistsPrecondition.checkFast(ColumnExistsPrecondition.java:163) 19 | at liquibase.precondition.core.ColumnExistsPrecondition.check(ColumnExistsPrecondition.java:81) 20 | at liquibase.precondition.core.NotPrecondition.check(NotPrecondition.java:35) 21 | at liquibase.precondition.core.AndPrecondition.check(AndPrecondition.java:40) 22 | at liquibase.precondition.core.PreconditionContainer.check(PreconditionContainer.java:213) 23 | at liquibase.changelog.ChangeSet.execute(ChangeSet.java:577) 24 | at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:56) 25 | at liquibase.changelog.ChangeLogIterator$2.lambda$null$0(ChangeLogIterator.java:113) 26 | at liquibase.Scope.lambda$child$0(Scope.java:180) 27 | at liquibase.Scope.child(Scope.java:189) 28 | at liquibase.Scope.child(Scope.java:179) 29 | at liquibase.Scope.child(Scope.java:158) 30 | at liquibase.changelog.ChangeLogIterator$2.lambda$run$1(ChangeLogIterator.java:112) 31 | at liquibase.Scope.lambda$child$0(Scope.java:180) 32 | at liquibase.Scope.child(Scope.java:189) 33 | at liquibase.Scope.child(Scope.java:179) 34 | at liquibase.Scope.child(Scope.java:158) 35 | at liquibase.Scope.child(Scope.java:243) 36 | at liquibase.changelog.ChangeLogIterator$2.run(ChangeLogIterator.java:93) 37 | at liquibase.Scope.lambda$child$0(Scope.java:180) 38 | at liquibase.Scope.child(Scope.java:189) 39 | at liquibase.Scope.child(Scope.java:179) 40 | at liquibase.Scope.child(Scope.java:158) 41 | at liquibase.Scope.child(Scope.java:243) 42 | at liquibase.Scope.child(Scope.java:247) 43 | at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:65) 44 | at liquibase.Liquibase.lambda$null$0(Liquibase.java:265) 45 | at liquibase.Scope.lambda$child$0(Scope.java:180) 46 | at liquibase.Scope.child(Scope.java:189) 47 | at liquibase.Scope.child(Scope.java:179) 48 | at liquibase.Scope.child(Scope.java:158) 49 | at liquibase.Scope.child(Scope.java:243) 50 | at liquibase.Liquibase.lambda$update$1(Liquibase.java:264) 51 | at liquibase.Scope.lambda$child$0(Scope.java:180) 52 | at liquibase.Scope.child(Scope.java:189) 53 | at liquibase.Scope.child(Scope.java:179) 54 | at liquibase.Scope.child(Scope.java:158) 55 | at liquibase.Liquibase.runInScope(Liquibase.java:2405) 56 | at liquibase.Liquibase.update(Liquibase.java:211) 57 | at liquibase.Liquibase.update(Liquibase.java:197) 58 | at liquibase.Liquibase.update(Liquibase.java:193) 59 | at metabase.db.liquibase$migrate_up_if_needed_BANG_.invokeStatic(liquibase.clj:142) 60 | at metabase.db.liquibase$migrate_up_if_needed_BANG_.invoke(liquibase.clj:130) 61 | at metabase.db.setup$fn__35436$migrate_BANG___35441$fn__35442$fn__35443.invoke(setup.clj:66) 62 | at metabase.db.liquibase$fn__30951$do_with_liquibase__30956$fn__30957.invoke(liquibase.clj:59) 63 | at metabase.db.liquibase$fn__30951$do_with_liquibase__30956.invoke(liquibase.clj:51) 64 | at metabase.db.setup$fn__35436$migrate_BANG___35441$fn__35442.invoke(setup.clj:61) 65 | at metabase.db.setup$fn__35436$migrate_BANG___35441.invoke(setup.clj:40) 66 | at metabase.db.setup$fn__35495$run_schema_migrations_BANG___35500$fn__35501.invoke(setup.clj:119) 67 | at metabase.db.setup$fn__35495$run_schema_migrations_BANG___35500.invoke(setup.clj:113) 68 | at metabase.db.setup$fn__35547$setup_db_BANG___35552$fn__35553$fn__35556$fn__35557.invoke(setup.clj:145) 69 | at metabase.util$do_with_us_locale.invokeStatic(util.clj:716) 70 | at metabase.util$do_with_us_locale.invoke(util.clj:702) 71 | at metabase.db.setup$fn__35547$setup_db_BANG___35552$fn__35553$fn__35556.invoke(setup.clj:143) 72 | at metabase.db.setup$fn__35547$setup_db_BANG___35552$fn__35553.invoke(setup.clj:142) 73 | at metabase.db.setup$fn__35547$setup_db_BANG___35552.invoke(setup.clj:136) 74 | at metabase.db$setup_db_BANG_$fn__35582.invoke(db.clj:65) 75 | at metabase.db$setup_db_BANG_.invokeStatic(db.clj:60) 76 | at metabase.db$setup_db_BANG_.invoke(db.clj:51) 77 | at metabase.core$init_BANG__STAR_.invokeStatic(core.clj:100) 78 | at metabase.core$init_BANG__STAR_.invoke(core.clj:83) 79 | at metabase.core$init_BANG_.invokeStatic(core.clj:145) 80 | at metabase.core$init_BANG_.invoke(core.clj:140) 81 | at metabase.core$start_normally.invokeStatic(core.clj:157) 82 | at metabase.core$start_normally.invoke(core.clj:151) 83 | at metabase.core$_main.invokeStatic(core.clj:190) 84 | at metabase.core$_main.doInvoke(core.clj:184) 85 | at clojure.lang.RestFn.invoke(RestFn.java:397) 86 | at clojure.lang.AFn.applyToHelper(AFn.java:152) 87 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 88 | at metabase.core.main(Unknown Source) 89 | 2022-10-27 12:32:50 jdbc[13]: exception 90 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 91 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 92 | at org.h2.message.DbException.get(DbException.java:179) 93 | at org.h2.message.DbException.get(DbException.java:155) 94 | at org.h2.message.DbException.get(DbException.java:144) 95 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 96 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 97 | at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:302) 98 | at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:567) 99 | at clojure.java.jdbc$prepare_statement.invokeStatic(jdbc.clj:679) 100 | at clojure.java.jdbc$prepare_statement.invoke(jdbc.clj:626) 101 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1112) 102 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 103 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 104 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 105 | at toucan.db$query.invokeStatic(db.clj:308) 106 | at toucan.db$query.doInvoke(db.clj:304) 107 | at clojure.lang.RestFn.invoke(RestFn.java:410) 108 | at toucan.db$simple_select.invokeStatic(db.clj:414) 109 | at toucan.db$simple_select.invoke(db.clj:403) 110 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 111 | at toucan.db$simple_select_one.invoke(db.clj:429) 112 | at toucan.db$select_one.invokeStatic(db.clj:670) 113 | at toucan.db$select_one.doInvoke(db.clj:664) 114 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 115 | at clojure.core$apply.invokeStatic(core.clj:669) 116 | at clojure.core$apply.invoke(core.clj:662) 117 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 118 | at toucan.db$select_one_field.doInvoke(db.clj:675) 119 | at clojure.lang.RestFn.invoke(RestFn.java:442) 120 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 121 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 122 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 123 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 124 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 125 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 126 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 127 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 128 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 129 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 130 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 131 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 132 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 133 | at clojure.lang.Var.invoke(Var.java:388) 134 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 135 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 136 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 137 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 138 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 139 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 140 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 141 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 142 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 143 | at clojure.lang.RestFn.invoke(RestFn.java:410) 144 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 145 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 146 | at clojure.core$apply.invokeStatic(core.clj:669) 147 | at clojure.core$apply.invoke(core.clj:662) 148 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 149 | at clojure.core$str.invokeStatic(core.clj:555) 150 | at clojure.core$str.invoke(core.clj:546) 151 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 152 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 153 | at clojure.lang.AFn.run(AFn.java:22) 154 | at java.base/java.lang.Thread.run(Thread.java:1589) 155 | 2022-10-27 12:32:50 jdbc[13]: exception 156 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 157 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 158 | at org.h2.message.DbException.get(DbException.java:179) 159 | at org.h2.message.DbException.get(DbException.java:155) 160 | at org.h2.message.DbException.get(DbException.java:144) 161 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 162 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 163 | at org.h2.jdbc.JdbcConnection.getAutoCommit(JdbcConnection.java:476) 164 | at com.mchange.v2.c3p0.impl.C3P0ImplUtils.resetTxnState(C3P0ImplUtils.java:245) 165 | at com.mchange.v2.c3p0.impl.NewPooledConnection.reset(NewPooledConnection.java:461) 166 | at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:417) 167 | at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:87) 168 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1111) 169 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 170 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 171 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 172 | at toucan.db$query.invokeStatic(db.clj:308) 173 | at toucan.db$query.doInvoke(db.clj:304) 174 | at clojure.lang.RestFn.invoke(RestFn.java:410) 175 | at toucan.db$simple_select.invokeStatic(db.clj:414) 176 | at toucan.db$simple_select.invoke(db.clj:403) 177 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 178 | at toucan.db$simple_select_one.invoke(db.clj:429) 179 | at toucan.db$select_one.invokeStatic(db.clj:670) 180 | at toucan.db$select_one.doInvoke(db.clj:664) 181 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 182 | at clojure.core$apply.invokeStatic(core.clj:669) 183 | at clojure.core$apply.invoke(core.clj:662) 184 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 185 | at toucan.db$select_one_field.doInvoke(db.clj:675) 186 | at clojure.lang.RestFn.invoke(RestFn.java:442) 187 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 188 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 189 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 190 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 191 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 192 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 193 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 194 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 195 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 196 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 197 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 198 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 199 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 200 | at clojure.lang.Var.invoke(Var.java:388) 201 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 202 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 203 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 204 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 205 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 206 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 207 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 208 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 209 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 210 | at clojure.lang.RestFn.invoke(RestFn.java:410) 211 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 212 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 213 | at clojure.core$apply.invokeStatic(core.clj:669) 214 | at clojure.core$apply.invoke(core.clj:662) 215 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 216 | at clojure.core$str.invokeStatic(core.clj:555) 217 | at clojure.core$str.invoke(core.clj:546) 218 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 219 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 220 | at clojure.lang.AFn.run(AFn.java:22) 221 | at java.base/java.lang.Thread.run(Thread.java:1589) 222 | 2022-10-27 17:39:45 jdbc[5]: exception 223 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 224 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 225 | at org.h2.message.DbException.get(DbException.java:179) 226 | at org.h2.message.DbException.get(DbException.java:155) 227 | at org.h2.message.DbException.get(DbException.java:144) 228 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 229 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 230 | at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:302) 231 | at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:567) 232 | at clojure.java.jdbc$prepare_statement.invokeStatic(jdbc.clj:679) 233 | at clojure.java.jdbc$prepare_statement.invoke(jdbc.clj:626) 234 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1112) 235 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 236 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 237 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 238 | at toucan.db$query.invokeStatic(db.clj:308) 239 | at toucan.db$query.doInvoke(db.clj:304) 240 | at clojure.lang.RestFn.invoke(RestFn.java:410) 241 | at toucan.db$simple_select.invokeStatic(db.clj:414) 242 | at toucan.db$simple_select.invoke(db.clj:403) 243 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 244 | at toucan.db$simple_select_one.invoke(db.clj:429) 245 | at toucan.db$select_one.invokeStatic(db.clj:670) 246 | at toucan.db$select_one.doInvoke(db.clj:664) 247 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 248 | at clojure.core$apply.invokeStatic(core.clj:669) 249 | at clojure.core$apply.invoke(core.clj:662) 250 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 251 | at toucan.db$select_one_field.doInvoke(db.clj:675) 252 | at clojure.lang.RestFn.invoke(RestFn.java:442) 253 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 254 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 255 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 256 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 257 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 258 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 259 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 260 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 261 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 262 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 263 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 264 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 265 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 266 | at clojure.lang.Var.invoke(Var.java:388) 267 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 268 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 269 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 270 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 271 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 272 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 273 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 274 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 275 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 276 | at clojure.lang.RestFn.invoke(RestFn.java:410) 277 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 278 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 279 | at clojure.core$apply.invokeStatic(core.clj:669) 280 | at clojure.core$apply.invoke(core.clj:662) 281 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 282 | at clojure.core$str.invokeStatic(core.clj:555) 283 | at clojure.core$str.invoke(core.clj:546) 284 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 285 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 286 | at clojure.lang.AFn.run(AFn.java:22) 287 | at java.base/java.lang.Thread.run(Thread.java:1589) 288 | 2022-10-27 17:39:45 jdbc[5]: exception 289 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 290 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 291 | at org.h2.message.DbException.get(DbException.java:179) 292 | at org.h2.message.DbException.get(DbException.java:155) 293 | at org.h2.message.DbException.get(DbException.java:144) 294 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 295 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 296 | at org.h2.jdbc.JdbcConnection.getAutoCommit(JdbcConnection.java:476) 297 | at com.mchange.v2.c3p0.impl.C3P0ImplUtils.resetTxnState(C3P0ImplUtils.java:245) 298 | at com.mchange.v2.c3p0.impl.NewPooledConnection.reset(NewPooledConnection.java:461) 299 | at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:417) 300 | at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:87) 301 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1111) 302 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 303 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 304 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 305 | at toucan.db$query.invokeStatic(db.clj:308) 306 | at toucan.db$query.doInvoke(db.clj:304) 307 | at clojure.lang.RestFn.invoke(RestFn.java:410) 308 | at toucan.db$simple_select.invokeStatic(db.clj:414) 309 | at toucan.db$simple_select.invoke(db.clj:403) 310 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 311 | at toucan.db$simple_select_one.invoke(db.clj:429) 312 | at toucan.db$select_one.invokeStatic(db.clj:670) 313 | at toucan.db$select_one.doInvoke(db.clj:664) 314 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 315 | at clojure.core$apply.invokeStatic(core.clj:669) 316 | at clojure.core$apply.invoke(core.clj:662) 317 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 318 | at toucan.db$select_one_field.doInvoke(db.clj:675) 319 | at clojure.lang.RestFn.invoke(RestFn.java:442) 320 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 321 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 322 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 323 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 324 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 325 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 326 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 327 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 328 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 329 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 330 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 331 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 332 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 333 | at clojure.lang.Var.invoke(Var.java:388) 334 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 335 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 336 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 337 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 338 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 339 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 340 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 341 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 342 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 343 | at clojure.lang.RestFn.invoke(RestFn.java:410) 344 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 345 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 346 | at clojure.core$apply.invokeStatic(core.clj:669) 347 | at clojure.core$apply.invoke(core.clj:662) 348 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 349 | at clojure.core$str.invokeStatic(core.clj:555) 350 | at clojure.core$str.invoke(core.clj:546) 351 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 352 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 353 | at clojure.lang.AFn.run(AFn.java:22) 354 | at java.base/java.lang.Thread.run(Thread.java:1589) 355 | 2022-11-04 17:08:20 jdbc[13]: exception 356 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 357 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 358 | at org.h2.message.DbException.get(DbException.java:179) 359 | at org.h2.message.DbException.get(DbException.java:155) 360 | at org.h2.message.DbException.get(DbException.java:144) 361 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 362 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 363 | at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:302) 364 | at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:567) 365 | at clojure.java.jdbc$prepare_statement.invokeStatic(jdbc.clj:679) 366 | at clojure.java.jdbc$prepare_statement.invoke(jdbc.clj:626) 367 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1112) 368 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 369 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 370 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 371 | at toucan.db$query.invokeStatic(db.clj:308) 372 | at toucan.db$query.doInvoke(db.clj:304) 373 | at clojure.lang.RestFn.invoke(RestFn.java:410) 374 | at toucan.db$simple_select.invokeStatic(db.clj:414) 375 | at toucan.db$simple_select.invoke(db.clj:403) 376 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 377 | at toucan.db$simple_select_one.invoke(db.clj:429) 378 | at toucan.db$select_one.invokeStatic(db.clj:670) 379 | at toucan.db$select_one.doInvoke(db.clj:664) 380 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 381 | at clojure.core$apply.invokeStatic(core.clj:669) 382 | at clojure.core$apply.invoke(core.clj:662) 383 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 384 | at toucan.db$select_one_field.doInvoke(db.clj:675) 385 | at clojure.lang.RestFn.invoke(RestFn.java:442) 386 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 387 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 388 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 389 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 390 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 391 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 392 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 393 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 394 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 395 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 396 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 397 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 398 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 399 | at clojure.lang.Var.invoke(Var.java:388) 400 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 401 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 402 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 403 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 404 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 405 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 406 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 407 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 408 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 409 | at clojure.lang.RestFn.invoke(RestFn.java:410) 410 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 411 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 412 | at clojure.core$apply.invokeStatic(core.clj:669) 413 | at clojure.core$apply.invoke(core.clj:662) 414 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 415 | at clojure.core$str.invokeStatic(core.clj:555) 416 | at clojure.core$str.invoke(core.clj:546) 417 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 418 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 419 | at clojure.lang.AFn.run(AFn.java:22) 420 | at java.base/java.lang.Thread.run(Thread.java:1589) 421 | 2022-11-04 17:08:20 jdbc[13]: exception 422 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 423 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 424 | at org.h2.message.DbException.get(DbException.java:179) 425 | at org.h2.message.DbException.get(DbException.java:155) 426 | at org.h2.message.DbException.get(DbException.java:144) 427 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 428 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 429 | at org.h2.jdbc.JdbcConnection.getAutoCommit(JdbcConnection.java:476) 430 | at com.mchange.v2.c3p0.impl.C3P0ImplUtils.resetTxnState(C3P0ImplUtils.java:245) 431 | at com.mchange.v2.c3p0.impl.NewPooledConnection.reset(NewPooledConnection.java:461) 432 | at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:417) 433 | at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:87) 434 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1111) 435 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 436 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 437 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 438 | at toucan.db$query.invokeStatic(db.clj:308) 439 | at toucan.db$query.doInvoke(db.clj:304) 440 | at clojure.lang.RestFn.invoke(RestFn.java:410) 441 | at toucan.db$simple_select.invokeStatic(db.clj:414) 442 | at toucan.db$simple_select.invoke(db.clj:403) 443 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 444 | at toucan.db$simple_select_one.invoke(db.clj:429) 445 | at toucan.db$select_one.invokeStatic(db.clj:670) 446 | at toucan.db$select_one.doInvoke(db.clj:664) 447 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 448 | at clojure.core$apply.invokeStatic(core.clj:669) 449 | at clojure.core$apply.invoke(core.clj:662) 450 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 451 | at toucan.db$select_one_field.doInvoke(db.clj:675) 452 | at clojure.lang.RestFn.invoke(RestFn.java:442) 453 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 454 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 455 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 456 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 457 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 458 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 459 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 460 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 461 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 462 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 463 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 464 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 465 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 466 | at clojure.lang.Var.invoke(Var.java:388) 467 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 468 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 469 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 470 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 471 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 472 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 473 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 474 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 475 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 476 | at clojure.lang.RestFn.invoke(RestFn.java:410) 477 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 478 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 479 | at clojure.core$apply.invokeStatic(core.clj:669) 480 | at clojure.core$apply.invoke(core.clj:662) 481 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 482 | at clojure.core$str.invokeStatic(core.clj:555) 483 | at clojure.core$str.invoke(core.clj:546) 484 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 485 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 486 | at clojure.lang.AFn.run(AFn.java:22) 487 | at java.base/java.lang.Thread.run(Thread.java:1589) 488 | 2022-11-07 12:53:18 jdbc[11]: exception 489 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 490 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 491 | at org.h2.message.DbException.get(DbException.java:179) 492 | at org.h2.message.DbException.get(DbException.java:155) 493 | at org.h2.message.DbException.get(DbException.java:144) 494 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 495 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 496 | at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:302) 497 | at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:567) 498 | at clojure.java.jdbc$prepare_statement.invokeStatic(jdbc.clj:679) 499 | at clojure.java.jdbc$prepare_statement.invoke(jdbc.clj:626) 500 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1112) 501 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 502 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 503 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 504 | at toucan.db$query.invokeStatic(db.clj:308) 505 | at toucan.db$query.doInvoke(db.clj:304) 506 | at clojure.lang.RestFn.invoke(RestFn.java:410) 507 | at toucan.db$simple_select.invokeStatic(db.clj:414) 508 | at toucan.db$simple_select.invoke(db.clj:403) 509 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 510 | at toucan.db$simple_select_one.invoke(db.clj:429) 511 | at toucan.db$select_one.invokeStatic(db.clj:670) 512 | at toucan.db$select_one.doInvoke(db.clj:664) 513 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 514 | at clojure.core$apply.invokeStatic(core.clj:669) 515 | at clojure.core$apply.invoke(core.clj:662) 516 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 517 | at toucan.db$select_one_field.doInvoke(db.clj:675) 518 | at clojure.lang.RestFn.invoke(RestFn.java:442) 519 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 520 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 521 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 522 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 523 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 524 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 525 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 526 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 527 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 528 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 529 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 530 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 531 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 532 | at clojure.lang.Var.invoke(Var.java:388) 533 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 534 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 535 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 536 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 537 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 538 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 539 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 540 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 541 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 542 | at clojure.lang.RestFn.invoke(RestFn.java:410) 543 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 544 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 545 | at clojure.core$apply.invokeStatic(core.clj:669) 546 | at clojure.core$apply.invoke(core.clj:662) 547 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 548 | at clojure.core$str.invokeStatic(core.clj:555) 549 | at clojure.core$str.invoke(core.clj:546) 550 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 551 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 552 | at clojure.lang.AFn.run(AFn.java:22) 553 | at java.base/java.lang.Thread.run(Thread.java:1589) 554 | 2022-11-07 12:53:18 jdbc[11]: exception 555 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 556 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 557 | at org.h2.message.DbException.get(DbException.java:179) 558 | at org.h2.message.DbException.get(DbException.java:155) 559 | at org.h2.message.DbException.get(DbException.java:144) 560 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 561 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 562 | at org.h2.jdbc.JdbcConnection.getAutoCommit(JdbcConnection.java:476) 563 | at com.mchange.v2.c3p0.impl.C3P0ImplUtils.resetTxnState(C3P0ImplUtils.java:245) 564 | at com.mchange.v2.c3p0.impl.NewPooledConnection.reset(NewPooledConnection.java:461) 565 | at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:417) 566 | at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:87) 567 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1111) 568 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 569 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 570 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 571 | at toucan.db$query.invokeStatic(db.clj:308) 572 | at toucan.db$query.doInvoke(db.clj:304) 573 | at clojure.lang.RestFn.invoke(RestFn.java:410) 574 | at toucan.db$simple_select.invokeStatic(db.clj:414) 575 | at toucan.db$simple_select.invoke(db.clj:403) 576 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 577 | at toucan.db$simple_select_one.invoke(db.clj:429) 578 | at toucan.db$select_one.invokeStatic(db.clj:670) 579 | at toucan.db$select_one.doInvoke(db.clj:664) 580 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 581 | at clojure.core$apply.invokeStatic(core.clj:669) 582 | at clojure.core$apply.invoke(core.clj:662) 583 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 584 | at toucan.db$select_one_field.doInvoke(db.clj:675) 585 | at clojure.lang.RestFn.invoke(RestFn.java:442) 586 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 587 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 588 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 589 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 590 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 591 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 592 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 593 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 594 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 595 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 596 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 597 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 598 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 599 | at clojure.lang.Var.invoke(Var.java:388) 600 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 601 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 602 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 603 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 604 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 605 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 606 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 607 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 608 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 609 | at clojure.lang.RestFn.invoke(RestFn.java:410) 610 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 611 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 612 | at clojure.core$apply.invokeStatic(core.clj:669) 613 | at clojure.core$apply.invoke(core.clj:662) 614 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 615 | at clojure.core$str.invokeStatic(core.clj:555) 616 | at clojure.core$str.invoke(core.clj:546) 617 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 618 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 619 | at clojure.lang.AFn.run(AFn.java:22) 620 | at java.base/java.lang.Thread.run(Thread.java:1589) 621 | 2022-11-08 10:17:40 jdbc[9]: exception 622 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 623 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 624 | at org.h2.message.DbException.get(DbException.java:179) 625 | at org.h2.message.DbException.get(DbException.java:155) 626 | at org.h2.message.DbException.get(DbException.java:144) 627 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 628 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 629 | at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:302) 630 | at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:567) 631 | at clojure.java.jdbc$prepare_statement.invokeStatic(jdbc.clj:679) 632 | at clojure.java.jdbc$prepare_statement.invoke(jdbc.clj:626) 633 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1112) 634 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 635 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 636 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 637 | at toucan.db$query.invokeStatic(db.clj:308) 638 | at toucan.db$query.doInvoke(db.clj:304) 639 | at clojure.lang.RestFn.invoke(RestFn.java:410) 640 | at toucan.db$simple_select.invokeStatic(db.clj:414) 641 | at toucan.db$simple_select.invoke(db.clj:403) 642 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 643 | at toucan.db$simple_select_one.invoke(db.clj:429) 644 | at toucan.db$select_one.invokeStatic(db.clj:670) 645 | at toucan.db$select_one.doInvoke(db.clj:664) 646 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 647 | at clojure.core$apply.invokeStatic(core.clj:669) 648 | at clojure.core$apply.invoke(core.clj:662) 649 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 650 | at toucan.db$select_one_field.doInvoke(db.clj:675) 651 | at clojure.lang.RestFn.invoke(RestFn.java:442) 652 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 653 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 654 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 655 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 656 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 657 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 658 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 659 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 660 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 661 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 662 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 663 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 664 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 665 | at clojure.lang.Var.invoke(Var.java:388) 666 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 667 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 668 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 669 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 670 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 671 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 672 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 673 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 674 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 675 | at clojure.lang.RestFn.invoke(RestFn.java:410) 676 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 677 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 678 | at clojure.core$apply.invokeStatic(core.clj:669) 679 | at clojure.core$apply.invoke(core.clj:662) 680 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 681 | at clojure.core$str.invokeStatic(core.clj:555) 682 | at clojure.core$str.invoke(core.clj:546) 683 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 684 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 685 | at clojure.lang.AFn.run(AFn.java:22) 686 | at java.base/java.lang.Thread.run(Thread.java:1589) 687 | 2022-11-08 10:17:40 jdbc[9]: exception 688 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 689 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 690 | at org.h2.message.DbException.get(DbException.java:179) 691 | at org.h2.message.DbException.get(DbException.java:155) 692 | at org.h2.message.DbException.get(DbException.java:144) 693 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 694 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 695 | at org.h2.jdbc.JdbcConnection.getAutoCommit(JdbcConnection.java:476) 696 | at com.mchange.v2.c3p0.impl.C3P0ImplUtils.resetTxnState(C3P0ImplUtils.java:245) 697 | at com.mchange.v2.c3p0.impl.NewPooledConnection.reset(NewPooledConnection.java:461) 698 | at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:417) 699 | at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:87) 700 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1111) 701 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 702 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 703 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 704 | at toucan.db$query.invokeStatic(db.clj:308) 705 | at toucan.db$query.doInvoke(db.clj:304) 706 | at clojure.lang.RestFn.invoke(RestFn.java:410) 707 | at toucan.db$simple_select.invokeStatic(db.clj:414) 708 | at toucan.db$simple_select.invoke(db.clj:403) 709 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 710 | at toucan.db$simple_select_one.invoke(db.clj:429) 711 | at toucan.db$select_one.invokeStatic(db.clj:670) 712 | at toucan.db$select_one.doInvoke(db.clj:664) 713 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 714 | at clojure.core$apply.invokeStatic(core.clj:669) 715 | at clojure.core$apply.invoke(core.clj:662) 716 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 717 | at toucan.db$select_one_field.doInvoke(db.clj:675) 718 | at clojure.lang.RestFn.invoke(RestFn.java:442) 719 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 720 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 721 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 722 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 723 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 724 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 725 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 726 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 727 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 728 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 729 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 730 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 731 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 732 | at clojure.lang.Var.invoke(Var.java:388) 733 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 734 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 735 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 736 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 737 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 738 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 739 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 740 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 741 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 742 | at clojure.lang.RestFn.invoke(RestFn.java:410) 743 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 744 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 745 | at clojure.core$apply.invokeStatic(core.clj:669) 746 | at clojure.core$apply.invoke(core.clj:662) 747 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 748 | at clojure.core$str.invokeStatic(core.clj:555) 749 | at clojure.core$str.invoke(core.clj:546) 750 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 751 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 752 | at clojure.lang.AFn.run(AFn.java:22) 753 | at java.base/java.lang.Thread.run(Thread.java:1589) 754 | 2022-11-10 11:01:40 jdbc[3]: exception 755 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 756 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 757 | at org.h2.message.DbException.get(DbException.java:179) 758 | at org.h2.message.DbException.get(DbException.java:155) 759 | at org.h2.message.DbException.get(DbException.java:144) 760 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 761 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 762 | at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:302) 763 | at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:567) 764 | at clojure.java.jdbc$prepare_statement.invokeStatic(jdbc.clj:679) 765 | at clojure.java.jdbc$prepare_statement.invoke(jdbc.clj:626) 766 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1112) 767 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 768 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 769 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 770 | at toucan.db$query.invokeStatic(db.clj:308) 771 | at toucan.db$query.doInvoke(db.clj:304) 772 | at clojure.lang.RestFn.invoke(RestFn.java:410) 773 | at toucan.db$simple_select.invokeStatic(db.clj:414) 774 | at toucan.db$simple_select.invoke(db.clj:403) 775 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 776 | at toucan.db$simple_select_one.invoke(db.clj:429) 777 | at toucan.db$select_one.invokeStatic(db.clj:670) 778 | at toucan.db$select_one.doInvoke(db.clj:664) 779 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 780 | at clojure.core$apply.invokeStatic(core.clj:669) 781 | at clojure.core$apply.invoke(core.clj:662) 782 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 783 | at toucan.db$select_one_field.doInvoke(db.clj:675) 784 | at clojure.lang.RestFn.invoke(RestFn.java:442) 785 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 786 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 787 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 788 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 789 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 790 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 791 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 792 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 793 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 794 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 795 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 796 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 797 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 798 | at clojure.lang.Var.invoke(Var.java:388) 799 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 800 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 801 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 802 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 803 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 804 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 805 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 806 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 807 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 808 | at clojure.lang.RestFn.invoke(RestFn.java:410) 809 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 810 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 811 | at clojure.core$apply.invokeStatic(core.clj:669) 812 | at clojure.core$apply.invoke(core.clj:662) 813 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 814 | at clojure.core$str.invokeStatic(core.clj:555) 815 | at clojure.core$str.invoke(core.clj:546) 816 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 817 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 818 | at clojure.lang.AFn.run(AFn.java:22) 819 | at java.base/java.lang.Thread.run(Thread.java:833) 820 | 2022-11-10 11:01:40 jdbc[3]: exception 821 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 822 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 823 | at org.h2.message.DbException.get(DbException.java:179) 824 | at org.h2.message.DbException.get(DbException.java:155) 825 | at org.h2.message.DbException.get(DbException.java:144) 826 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 827 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 828 | at org.h2.jdbc.JdbcConnection.getAutoCommit(JdbcConnection.java:476) 829 | at com.mchange.v2.c3p0.impl.C3P0ImplUtils.resetTxnState(C3P0ImplUtils.java:245) 830 | at com.mchange.v2.c3p0.impl.NewPooledConnection.reset(NewPooledConnection.java:461) 831 | at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:417) 832 | at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:87) 833 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1111) 834 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 835 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 836 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 837 | at toucan.db$query.invokeStatic(db.clj:308) 838 | at toucan.db$query.doInvoke(db.clj:304) 839 | at clojure.lang.RestFn.invoke(RestFn.java:410) 840 | at toucan.db$simple_select.invokeStatic(db.clj:414) 841 | at toucan.db$simple_select.invoke(db.clj:403) 842 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 843 | at toucan.db$simple_select_one.invoke(db.clj:429) 844 | at toucan.db$select_one.invokeStatic(db.clj:670) 845 | at toucan.db$select_one.doInvoke(db.clj:664) 846 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 847 | at clojure.core$apply.invokeStatic(core.clj:669) 848 | at clojure.core$apply.invoke(core.clj:662) 849 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 850 | at toucan.db$select_one_field.doInvoke(db.clj:675) 851 | at clojure.lang.RestFn.invoke(RestFn.java:442) 852 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 853 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 854 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 855 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 856 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 857 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 858 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 859 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 860 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 861 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 862 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 863 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 864 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 865 | at clojure.lang.Var.invoke(Var.java:388) 866 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 867 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 868 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 869 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 870 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 871 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 872 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 873 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 874 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 875 | at clojure.lang.RestFn.invoke(RestFn.java:410) 876 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 877 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 878 | at clojure.core$apply.invokeStatic(core.clj:669) 879 | at clojure.core$apply.invoke(core.clj:662) 880 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 881 | at clojure.core$str.invokeStatic(core.clj:555) 882 | at clojure.core$str.invoke(core.clj:546) 883 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 884 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 885 | at clojure.lang.AFn.run(AFn.java:22) 886 | at java.base/java.lang.Thread.run(Thread.java:833) 887 | 2022-11-11 15:32:04 jdbc[7]: exception 888 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 889 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 890 | at org.h2.message.DbException.get(DbException.java:179) 891 | at org.h2.message.DbException.get(DbException.java:155) 892 | at org.h2.message.DbException.get(DbException.java:144) 893 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 894 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 895 | at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:302) 896 | at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:567) 897 | at clojure.java.jdbc$prepare_statement.invokeStatic(jdbc.clj:679) 898 | at clojure.java.jdbc$prepare_statement.invoke(jdbc.clj:626) 899 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1112) 900 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 901 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 902 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 903 | at toucan.db$query.invokeStatic(db.clj:308) 904 | at toucan.db$query.doInvoke(db.clj:304) 905 | at clojure.lang.RestFn.invoke(RestFn.java:410) 906 | at toucan.db$simple_select.invokeStatic(db.clj:414) 907 | at toucan.db$simple_select.invoke(db.clj:403) 908 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 909 | at toucan.db$simple_select_one.invoke(db.clj:429) 910 | at toucan.db$select_one.invokeStatic(db.clj:670) 911 | at toucan.db$select_one.doInvoke(db.clj:664) 912 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 913 | at clojure.core$apply.invokeStatic(core.clj:669) 914 | at clojure.core$apply.invoke(core.clj:662) 915 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 916 | at toucan.db$select_one_field.doInvoke(db.clj:675) 917 | at clojure.lang.RestFn.invoke(RestFn.java:442) 918 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 919 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 920 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 921 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 922 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 923 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 924 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 925 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 926 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 927 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 928 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 929 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 930 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 931 | at clojure.lang.Var.invoke(Var.java:388) 932 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 933 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 934 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 935 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 936 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 937 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 938 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 939 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 940 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 941 | at clojure.lang.RestFn.invoke(RestFn.java:410) 942 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 943 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 944 | at clojure.core$apply.invokeStatic(core.clj:669) 945 | at clojure.core$apply.invoke(core.clj:662) 946 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 947 | at clojure.core$str.invokeStatic(core.clj:555) 948 | at clojure.core$str.invoke(core.clj:546) 949 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 950 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 951 | at clojure.lang.AFn.run(AFn.java:22) 952 | at java.base/java.lang.Thread.run(Thread.java:833) 953 | 2022-11-11 15:32:04 jdbc[7]: exception 954 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 955 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 956 | at org.h2.message.DbException.get(DbException.java:179) 957 | at org.h2.message.DbException.get(DbException.java:155) 958 | at org.h2.message.DbException.get(DbException.java:144) 959 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 960 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 961 | at org.h2.jdbc.JdbcConnection.getAutoCommit(JdbcConnection.java:476) 962 | at com.mchange.v2.c3p0.impl.C3P0ImplUtils.resetTxnState(C3P0ImplUtils.java:245) 963 | at com.mchange.v2.c3p0.impl.NewPooledConnection.reset(NewPooledConnection.java:461) 964 | at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:417) 965 | at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:87) 966 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1111) 967 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 968 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 969 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 970 | at toucan.db$query.invokeStatic(db.clj:308) 971 | at toucan.db$query.doInvoke(db.clj:304) 972 | at clojure.lang.RestFn.invoke(RestFn.java:410) 973 | at toucan.db$simple_select.invokeStatic(db.clj:414) 974 | at toucan.db$simple_select.invoke(db.clj:403) 975 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 976 | at toucan.db$simple_select_one.invoke(db.clj:429) 977 | at toucan.db$select_one.invokeStatic(db.clj:670) 978 | at toucan.db$select_one.doInvoke(db.clj:664) 979 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 980 | at clojure.core$apply.invokeStatic(core.clj:669) 981 | at clojure.core$apply.invoke(core.clj:662) 982 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 983 | at toucan.db$select_one_field.doInvoke(db.clj:675) 984 | at clojure.lang.RestFn.invoke(RestFn.java:442) 985 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 986 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 987 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 988 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 989 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 990 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 991 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 992 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 993 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 994 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 995 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 996 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 997 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 998 | at clojure.lang.Var.invoke(Var.java:388) 999 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 1000 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 1001 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 1002 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 1003 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 1004 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 1005 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 1006 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 1007 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 1008 | at clojure.lang.RestFn.invoke(RestFn.java:410) 1009 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 1010 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 1011 | at clojure.core$apply.invokeStatic(core.clj:669) 1012 | at clojure.core$apply.invoke(core.clj:662) 1013 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 1014 | at clojure.core$str.invokeStatic(core.clj:555) 1015 | at clojure.core$str.invoke(core.clj:546) 1016 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 1017 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 1018 | at clojure.lang.AFn.run(AFn.java:22) 1019 | at java.base/java.lang.Thread.run(Thread.java:833) 1020 | 2022-11-11 16:09:39 jdbc[10]: exception 1021 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 1022 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 1023 | at org.h2.message.DbException.get(DbException.java:179) 1024 | at org.h2.message.DbException.get(DbException.java:155) 1025 | at org.h2.message.DbException.get(DbException.java:144) 1026 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 1027 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 1028 | at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:302) 1029 | at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:567) 1030 | at clojure.java.jdbc$prepare_statement.invokeStatic(jdbc.clj:679) 1031 | at clojure.java.jdbc$prepare_statement.invoke(jdbc.clj:626) 1032 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1112) 1033 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 1034 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 1035 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 1036 | at toucan.db$query.invokeStatic(db.clj:308) 1037 | at toucan.db$query.doInvoke(db.clj:304) 1038 | at clojure.lang.RestFn.invoke(RestFn.java:410) 1039 | at toucan.db$simple_select.invokeStatic(db.clj:414) 1040 | at toucan.db$simple_select.invoke(db.clj:403) 1041 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 1042 | at toucan.db$simple_select_one.invoke(db.clj:429) 1043 | at toucan.db$select_one.invokeStatic(db.clj:670) 1044 | at toucan.db$select_one.doInvoke(db.clj:664) 1045 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 1046 | at clojure.core$apply.invokeStatic(core.clj:669) 1047 | at clojure.core$apply.invoke(core.clj:662) 1048 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 1049 | at toucan.db$select_one_field.doInvoke(db.clj:675) 1050 | at clojure.lang.RestFn.invoke(RestFn.java:442) 1051 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 1052 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 1053 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 1054 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 1055 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 1056 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 1057 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 1058 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 1059 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 1060 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 1061 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 1062 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 1063 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 1064 | at clojure.lang.Var.invoke(Var.java:388) 1065 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 1066 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 1067 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 1068 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 1069 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 1070 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 1071 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 1072 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 1073 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 1074 | at clojure.lang.RestFn.invoke(RestFn.java:410) 1075 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 1076 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 1077 | at clojure.core$apply.invokeStatic(core.clj:669) 1078 | at clojure.core$apply.invoke(core.clj:662) 1079 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 1080 | at clojure.core$str.invokeStatic(core.clj:555) 1081 | at clojure.core$str.invoke(core.clj:546) 1082 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 1083 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 1084 | at clojure.lang.AFn.run(AFn.java:22) 1085 | at java.base/java.lang.Thread.run(Thread.java:833) 1086 | 2022-11-11 16:09:39 jdbc[10]: exception 1087 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 1088 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 1089 | at org.h2.message.DbException.get(DbException.java:179) 1090 | at org.h2.message.DbException.get(DbException.java:155) 1091 | at org.h2.message.DbException.get(DbException.java:144) 1092 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 1093 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 1094 | at org.h2.jdbc.JdbcConnection.getAutoCommit(JdbcConnection.java:476) 1095 | at com.mchange.v2.c3p0.impl.C3P0ImplUtils.resetTxnState(C3P0ImplUtils.java:245) 1096 | at com.mchange.v2.c3p0.impl.NewPooledConnection.reset(NewPooledConnection.java:461) 1097 | at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:417) 1098 | at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:87) 1099 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1111) 1100 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 1101 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 1102 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 1103 | at toucan.db$query.invokeStatic(db.clj:308) 1104 | at toucan.db$query.doInvoke(db.clj:304) 1105 | at clojure.lang.RestFn.invoke(RestFn.java:410) 1106 | at toucan.db$simple_select.invokeStatic(db.clj:414) 1107 | at toucan.db$simple_select.invoke(db.clj:403) 1108 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 1109 | at toucan.db$simple_select_one.invoke(db.clj:429) 1110 | at toucan.db$select_one.invokeStatic(db.clj:670) 1111 | at toucan.db$select_one.doInvoke(db.clj:664) 1112 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 1113 | at clojure.core$apply.invokeStatic(core.clj:669) 1114 | at clojure.core$apply.invoke(core.clj:662) 1115 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 1116 | at toucan.db$select_one_field.doInvoke(db.clj:675) 1117 | at clojure.lang.RestFn.invoke(RestFn.java:442) 1118 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 1119 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 1120 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 1121 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 1122 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:417) 1123 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:404) 1124 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:458) 1125 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 1126 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:472) 1127 | at metabase.models.setting$get_raw_value.invoke(setting.clj:432) 1128 | at metabase.models.setting$fn__30570.invokeStatic(setting.clj:491) 1129 | at metabase.models.setting$fn__30570.invoke(setting.clj:489) 1130 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 1131 | at clojure.lang.Var.invoke(Var.java:388) 1132 | at metabase.util.i18n.impl$fn__1646$f__1647.invoke(impl.clj:188) 1133 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:199) 1134 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:192) 1135 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 1136 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 1137 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 1138 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 1139 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 1140 | at metabase.util.i18n$translate_site_locale.doInvoke(i18n.clj:66) 1141 | at clojure.lang.RestFn.invoke(RestFn.java:410) 1142 | at clojure.lang.AFn.applyToHelper(AFn.java:154) 1143 | at clojure.lang.RestFn.applyTo(RestFn.java:132) 1144 | at clojure.core$apply.invokeStatic(core.clj:669) 1145 | at clojure.core$apply.invoke(core.clj:662) 1146 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 1147 | at clojure.core$str.invokeStatic(core.clj:555) 1148 | at clojure.core$str.invoke(core.clj:546) 1149 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:75) 1150 | at metabase.core$destroy_BANG_.invoke(core.clj:72) 1151 | at clojure.lang.AFn.run(AFn.java:22) 1152 | at java.base/java.lang.Thread.run(Thread.java:833) 1153 | 2022-12-13 10:26:21 jdbc[11]: exception 1154 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 1155 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 1156 | at org.h2.message.DbException.get(DbException.java:179) 1157 | at org.h2.message.DbException.get(DbException.java:155) 1158 | at org.h2.message.DbException.get(DbException.java:144) 1159 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 1160 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 1161 | at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:302) 1162 | at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:567) 1163 | at clojure.java.jdbc$prepare_statement.invokeStatic(jdbc.clj:679) 1164 | at clojure.java.jdbc$prepare_statement.invoke(jdbc.clj:626) 1165 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1112) 1166 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 1167 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 1168 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 1169 | at toucan.db$query.invokeStatic(db.clj:308) 1170 | at toucan.db$query.doInvoke(db.clj:304) 1171 | at clojure.lang.RestFn.invoke(RestFn.java:410) 1172 | at toucan.db$simple_select.invokeStatic(db.clj:414) 1173 | at toucan.db$simple_select.invoke(db.clj:403) 1174 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 1175 | at toucan.db$simple_select_one.invoke(db.clj:429) 1176 | at toucan.db$select_one.invokeStatic(db.clj:670) 1177 | at toucan.db$select_one.doInvoke(db.clj:664) 1178 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 1179 | at clojure.core$apply.invokeStatic(core.clj:669) 1180 | at clojure.core$apply.invoke(core.clj:662) 1181 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 1182 | at toucan.db$select_one_field.doInvoke(db.clj:675) 1183 | at clojure.lang.RestFn.invoke(RestFn.java:442) 1184 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 1185 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 1186 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 1187 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 1188 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:422) 1189 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:409) 1190 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:463) 1191 | at metabase.models.setting$get_raw_value.invoke(setting.clj:437) 1192 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:477) 1193 | at metabase.models.setting$get_raw_value.invoke(setting.clj:437) 1194 | at metabase.models.setting$fn__30726.invokeStatic(setting.clj:496) 1195 | at metabase.models.setting$fn__30726.invoke(setting.clj:494) 1196 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 1197 | at clojure.lang.Var.invoke(Var.java:388) 1198 | at metabase.util.i18n.impl$fn__3811$f__3812.invoke(impl.clj:211) 1199 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:222) 1200 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:215) 1201 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 1202 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 1203 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 1204 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 1205 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 1206 | at metabase.util.i18n$translate_site_locale.invoke(i18n.clj:66) 1207 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 1208 | at clojure.core$str.invokeStatic(core.clj:555) 1209 | at clojure.core$str.invoke(core.clj:546) 1210 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:79) 1211 | at metabase.core$destroy_BANG_.invoke(core.clj:76) 1212 | at clojure.lang.AFn.run(AFn.java:22) 1213 | at java.base/java.lang.Thread.run(Thread.java:833) 1214 | 2022-12-13 10:26:21 jdbc[11]: exception 1215 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 1216 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 1217 | at org.h2.message.DbException.get(DbException.java:179) 1218 | at org.h2.message.DbException.get(DbException.java:155) 1219 | at org.h2.message.DbException.get(DbException.java:144) 1220 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 1221 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 1222 | at org.h2.jdbc.JdbcConnection.getAutoCommit(JdbcConnection.java:476) 1223 | at com.mchange.v2.c3p0.impl.C3P0ImplUtils.resetTxnState(C3P0ImplUtils.java:245) 1224 | at com.mchange.v2.c3p0.impl.NewPooledConnection.reset(NewPooledConnection.java:461) 1225 | at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:417) 1226 | at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:87) 1227 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1111) 1228 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 1229 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 1230 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 1231 | at toucan.db$query.invokeStatic(db.clj:308) 1232 | at toucan.db$query.doInvoke(db.clj:304) 1233 | at clojure.lang.RestFn.invoke(RestFn.java:410) 1234 | at toucan.db$simple_select.invokeStatic(db.clj:414) 1235 | at toucan.db$simple_select.invoke(db.clj:403) 1236 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 1237 | at toucan.db$simple_select_one.invoke(db.clj:429) 1238 | at toucan.db$select_one.invokeStatic(db.clj:670) 1239 | at toucan.db$select_one.doInvoke(db.clj:664) 1240 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 1241 | at clojure.core$apply.invokeStatic(core.clj:669) 1242 | at clojure.core$apply.invoke(core.clj:662) 1243 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 1244 | at toucan.db$select_one_field.doInvoke(db.clj:675) 1245 | at clojure.lang.RestFn.invoke(RestFn.java:442) 1246 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 1247 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 1248 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 1249 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 1250 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:422) 1251 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:409) 1252 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:463) 1253 | at metabase.models.setting$get_raw_value.invoke(setting.clj:437) 1254 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:477) 1255 | at metabase.models.setting$get_raw_value.invoke(setting.clj:437) 1256 | at metabase.models.setting$fn__30726.invokeStatic(setting.clj:496) 1257 | at metabase.models.setting$fn__30726.invoke(setting.clj:494) 1258 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 1259 | at clojure.lang.Var.invoke(Var.java:388) 1260 | at metabase.util.i18n.impl$fn__3811$f__3812.invoke(impl.clj:211) 1261 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:222) 1262 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:215) 1263 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 1264 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 1265 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 1266 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 1267 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 1268 | at metabase.util.i18n$translate_site_locale.invoke(i18n.clj:66) 1269 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 1270 | at clojure.core$str.invokeStatic(core.clj:555) 1271 | at clojure.core$str.invoke(core.clj:546) 1272 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:79) 1273 | at metabase.core$destroy_BANG_.invoke(core.clj:76) 1274 | at clojure.lang.AFn.run(AFn.java:22) 1275 | at java.base/java.lang.Thread.run(Thread.java:833) 1276 | 2022-12-13 16:30:16 jdbc[11]: exception 1277 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 1278 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 1279 | at org.h2.message.DbException.get(DbException.java:179) 1280 | at org.h2.message.DbException.get(DbException.java:155) 1281 | at org.h2.message.DbException.get(DbException.java:144) 1282 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 1283 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 1284 | at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:302) 1285 | at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:567) 1286 | at clojure.java.jdbc$prepare_statement.invokeStatic(jdbc.clj:679) 1287 | at clojure.java.jdbc$prepare_statement.invoke(jdbc.clj:626) 1288 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1112) 1289 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 1290 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 1291 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 1292 | at toucan.db$query.invokeStatic(db.clj:308) 1293 | at toucan.db$query.doInvoke(db.clj:304) 1294 | at clojure.lang.RestFn.invoke(RestFn.java:410) 1295 | at toucan.db$simple_select.invokeStatic(db.clj:414) 1296 | at toucan.db$simple_select.invoke(db.clj:403) 1297 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 1298 | at toucan.db$simple_select_one.invoke(db.clj:429) 1299 | at toucan.db$select_one.invokeStatic(db.clj:670) 1300 | at toucan.db$select_one.doInvoke(db.clj:664) 1301 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 1302 | at clojure.core$apply.invokeStatic(core.clj:669) 1303 | at clojure.core$apply.invoke(core.clj:662) 1304 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 1305 | at toucan.db$select_one_field.doInvoke(db.clj:675) 1306 | at clojure.lang.RestFn.invoke(RestFn.java:442) 1307 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 1308 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 1309 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 1310 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 1311 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:422) 1312 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:409) 1313 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:463) 1314 | at metabase.models.setting$get_raw_value.invoke(setting.clj:437) 1315 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:477) 1316 | at metabase.models.setting$get_raw_value.invoke(setting.clj:437) 1317 | at metabase.models.setting$fn__30726.invokeStatic(setting.clj:496) 1318 | at metabase.models.setting$fn__30726.invoke(setting.clj:494) 1319 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 1320 | at clojure.lang.Var.invoke(Var.java:388) 1321 | at metabase.util.i18n.impl$fn__3811$f__3812.invoke(impl.clj:211) 1322 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:222) 1323 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:215) 1324 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 1325 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 1326 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 1327 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 1328 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 1329 | at metabase.util.i18n$translate_site_locale.invoke(i18n.clj:66) 1330 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 1331 | at clojure.core$str.invokeStatic(core.clj:555) 1332 | at clojure.core$str.invoke(core.clj:546) 1333 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:79) 1334 | at metabase.core$destroy_BANG_.invoke(core.clj:76) 1335 | at clojure.lang.AFn.run(AFn.java:22) 1336 | at java.base/java.lang.Thread.run(Thread.java:833) 1337 | 2022-12-13 16:30:16 jdbc[11]: exception 1338 | org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197] 1339 | at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) 1340 | at org.h2.message.DbException.get(DbException.java:179) 1341 | at org.h2.message.DbException.get(DbException.java:155) 1342 | at org.h2.message.DbException.get(DbException.java:144) 1343 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1526) 1344 | at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1502) 1345 | at org.h2.jdbc.JdbcConnection.getAutoCommit(JdbcConnection.java:476) 1346 | at com.mchange.v2.c3p0.impl.C3P0ImplUtils.resetTxnState(C3P0ImplUtils.java:245) 1347 | at com.mchange.v2.c3p0.impl.NewPooledConnection.reset(NewPooledConnection.java:461) 1348 | at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:417) 1349 | at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:87) 1350 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1111) 1351 | at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093) 1352 | at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182) 1353 | at clojure.java.jdbc$query.invoke(jdbc.clj:1144) 1354 | at toucan.db$query.invokeStatic(db.clj:308) 1355 | at toucan.db$query.doInvoke(db.clj:304) 1356 | at clojure.lang.RestFn.invoke(RestFn.java:410) 1357 | at toucan.db$simple_select.invokeStatic(db.clj:414) 1358 | at toucan.db$simple_select.invoke(db.clj:403) 1359 | at toucan.db$simple_select_one.invokeStatic(db.clj:440) 1360 | at toucan.db$simple_select_one.invoke(db.clj:429) 1361 | at toucan.db$select_one.invokeStatic(db.clj:670) 1362 | at toucan.db$select_one.doInvoke(db.clj:664) 1363 | at clojure.lang.RestFn.applyTo(RestFn.java:139) 1364 | at clojure.core$apply.invokeStatic(core.clj:669) 1365 | at clojure.core$apply.invoke(core.clj:662) 1366 | at toucan.db$select_one_field.invokeStatic(db.clj:682) 1367 | at toucan.db$select_one_field.doInvoke(db.clj:675) 1368 | at clojure.lang.RestFn.invoke(RestFn.java:442) 1369 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invokeStatic(cache.clj:111) 1370 | at metabase.models.setting.cache$cache_out_of_date_QMARK_.invoke(cache.clj:92) 1371 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invokeStatic(cache.clj:161) 1372 | at metabase.models.setting.cache$restore_cache_if_needed_BANG_.invoke(cache.clj:141) 1373 | at metabase.models.setting$db_or_cache_value.invokeStatic(setting.clj:422) 1374 | at metabase.models.setting$db_or_cache_value.invoke(setting.clj:409) 1375 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:463) 1376 | at metabase.models.setting$get_raw_value.invoke(setting.clj:437) 1377 | at metabase.models.setting$get_raw_value.invokeStatic(setting.clj:477) 1378 | at metabase.models.setting$get_raw_value.invoke(setting.clj:437) 1379 | at metabase.models.setting$fn__30726.invokeStatic(setting.clj:496) 1380 | at metabase.models.setting$fn__30726.invoke(setting.clj:494) 1381 | at clojure.lang.MultiFn.invoke(MultiFn.java:234) 1382 | at clojure.lang.Var.invoke(Var.java:388) 1383 | at metabase.util.i18n.impl$fn__3811$f__3812.invoke(impl.clj:211) 1384 | at metabase.util.i18n.impl$site_locale_from_setting.invokeStatic(impl.clj:222) 1385 | at metabase.util.i18n.impl$site_locale_from_setting.invoke(impl.clj:215) 1386 | at metabase.util.i18n$site_locale_string.invokeStatic(i18n.clj:37) 1387 | at metabase.util.i18n$site_locale_string.invoke(i18n.clj:32) 1388 | at metabase.util.i18n$site_locale.invokeStatic(i18n.clj:50) 1389 | at metabase.util.i18n$site_locale.invoke(i18n.clj:47) 1390 | at metabase.util.i18n$translate_site_locale.invokeStatic(i18n.clj:69) 1391 | at metabase.util.i18n$translate_site_locale.invoke(i18n.clj:66) 1392 | at metabase.util.i18n.SiteLocalizedString.toString(i18n.clj:94) 1393 | at clojure.core$str.invokeStatic(core.clj:555) 1394 | at clojure.core$str.invoke(core.clj:546) 1395 | at metabase.core$destroy_BANG_.invokeStatic(core.clj:79) 1396 | at metabase.core$destroy_BANG_.invoke(core.clj:76) 1397 | at clojure.lang.AFn.run(AFn.java:22) 1398 | at java.base/java.lang.Thread.run(Thread.java:833) 1399 | --------------------------------------------------------------------------------