#注意 修改此文件，必须同步修改app-delivery仓库的配置文件： https://github.com/tidbcloud/app-delivery/blob/main/dev/clinic/clinic-data-service/envs/dev-cloud/configs/config-dataproxy.yaml

# Clinic 内部 dev API 配置
clinic_api_base: "http://dev-clinic-intenal-api-875656712.us-west-2.elb.amazonaws.com"
clinic_api_public: "https://dev-clinic.pingcap.com/clinic/api/v1"
clinic_base_url: "https://clinic.pingcap.com"
# Optional: user-authorized TiDB management HTTP API. Leave unset only where no
# environment-specific endpoint has been provisioned.
# tidb_mgmt_http_base: "https://us-west-2.<environment>.aws.tidbcloud.com"

ticdc:
  dataflow_addr: "vpce-0642b576728f31be5-d29x03vc.vpce-svc-0bb4e079eb3f71c7b.us-west-2.vpce.amazonaws.com:10103"
  dataflow_ng_addr: "vpce-0642b576728f31be5-d29x03vc.vpce-svc-0bb4e079eb3f71c7b.us-west-2.vpce.amazonaws.com:10104"

# AWS 配置
aws:
  enabled: true
  athena_database: "clinic_data_proxy_dev"
  athena_workgroup: "primary"
  athena_output_location: "s3://aws-athena-query-results-{region}-557537366020/"
  # role_arn: "arn:aws:iam::557537366020:role/clinic-data-service-athena"

  # 本地可通过 AWS_PROFILE 使用默认凭证链；如显式注入临时 AK/SK，则从环境变量读取。
  access_key: ${AWS_ACCESS_KEY_ID}
  secret_key: ${AWS_SECRET_ACCESS_KEY}
  session_token: ${AWS_SESSION_TOKEN}


  table_manager:
    enabled: true
    auto_create: true
    cache_ttl_seconds: 0  # 0 表示永不过期（表一旦创建就永远存在）
    # Athena 分区投影 instance 枚举与 S3 对齐：间隔内 List S3 + Glue，必要时 ALTER SET TBLPROPERTIES。0=关闭。
    instance_projection_refresh_seconds: 600

    table_templates:
      slow_query_logs:
        ddl: |
          CREATE EXTERNAL TABLE `{{.Database}}`.`{{.Table}}`
          LOCATION '{{.Location}}'
          TBLPROPERTIES ('table_type' = 'DELTA');

      statements:
        ddl: |
          CREATE EXTERNAL TABLE `{{.Database}}`.`{{.Table}}`
          LOCATION '{{.Location}}'
          TBLPROPERTIES ('table_type' = 'DELTA');

      log_stats_global:
        ddl: |
          CREATE EXTERNAL TABLE `{{.Database}}`.`{{.Table}}`
          LOCATION '{{.Location}}'
          TBLPROPERTIES ('table_type' = 'DELTA');

      log_stats:
        type: view
        depends_on:
          - log_stats_global
        ddl: |
          CREATE OR REPLACE VIEW "{{.Database}}"."{{.Table}}" AS
          SELECT
            "hour",
            "project",
            "level",
            "file",
            "line",
            "count",
            "msg_digest",
            "sample",
            "component",
            "date",
            "org",
            "cluster"
          FROM "{{.Database}}"."{{.DepLogStatsGlobal}}"
          WHERE "org" = '{{.ClinicTenantId}}'
            AND "cluster" = '{{.ClusterId}}'

      topsql_tidb:
        ddl: |
          CREATE EXTERNAL TABLE `{{.Database}}`.`{{.Table}}` (
            `db` STRING,
            `keyspace` STRING,
            `plan_digest` STRING,
            `region_id` STRING,
            `sql_digest` STRING,
            `table` STRING,
            `table_id` BIGINT,
            `tag_label` STRING,
            `timestamps` BIGINT,
            `topsql_cpu_time_ms` INT,
            `topsql_logical_read_bytes` BIGINT,
            `topsql_logical_write_bytes` BIGINT,
            `topsql_network_in_bytes` BIGINT,
            `topsql_network_out_bytes` BIGINT,
            `topsql_read_keys` BIGINT,
            `topsql_stmt_duration_count` BIGINT,
            `topsql_stmt_duration_sum_ns` BIGINT,
            `topsql_stmt_exec_count` BIGINT,
            `topsql_write_keys` BIGINT
          )
          PARTITIONED BY (`instance` STRING, `date` STRING)
          ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
          STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
          OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
          LOCATION '{{.Location}}'
          TBLPROPERTIES (
            'parquet.compress'='ZSTD',
            'classification'='parquet',
            'projection.enabled'='true',
            'projection.date.type'='date',
            'projection.date.range'='2020-01-01,NOW',
            'projection.date.format'='yyyy-MM-dd',
            'projection.date.interval'='1',
            'projection.date.interval.unit'='DAYS',
            'projection.instance.type'='enum',
            'projection.instance.values'='{{.InstanceValues}}',
            'storage.location.template'='{{.Location}}/instance=${instance}/date=${date}/'
          );

      topsql_tikv:
        ddl: |
          CREATE EXTERNAL TABLE `{{.Database}}`.`{{.Table}}` (
            `db` STRING,
            `keyspace` STRING,
            `plan_digest` STRING,
            `region_id` STRING,
            `sql_digest` STRING,
            `table` STRING,
            `table_id` BIGINT,
            `tag_label` STRING,
            `timestamps` BIGINT,
            `topsql_cpu_time_ms` INT,
            `topsql_logical_read_bytes` BIGINT,
            `topsql_logical_write_bytes` BIGINT,
            `topsql_network_in_bytes` BIGINT,
            `topsql_network_out_bytes` BIGINT,
            `topsql_read_keys` BIGINT,
            `topsql_stmt_duration_count` BIGINT,
            `topsql_stmt_duration_sum_ns` BIGINT,
            `topsql_stmt_exec_count` BIGINT,
            `topsql_write_keys` BIGINT
          )
          PARTITIONED BY (`instance` STRING, `date` STRING)
          ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
          STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
          OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
          LOCATION '{{.Location}}'
          TBLPROPERTIES (
            'parquet.compress'='ZSTD',
            'classification'='parquet',
            'projection.enabled'='true',
            'projection.date.type'='date',
            'projection.date.range'='2020-01-01,NOW',
            'projection.date.format'='yyyy-MM-dd',
            'projection.date.interval'='1',
            'projection.date.interval.unit'='DAYS',
            'projection.instance.type'='enum',
            'projection.instance.values'='{{.InstanceValues}}',
            'storage.location.template'='{{.Location}}/instance=${instance}/date=${date}/'
          );

      topsql_plan_meta:
        ddl: |
          CREATE EXTERNAL TABLE `{{.Database}}`.`{{.Table}}` (
            `encoded_normalized_plan` STRING,
            `normalized_plan` STRING,
            `plan_digest` STRING
          )
          PARTITIONED BY (`date` STRING)
          ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
          STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
          OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
          LOCATION '{{.Location}}'
          TBLPROPERTIES (
            'parquet.compress'='ZSTD',
            'classification'='parquet',
            'projection.enabled'='true',
            'projection.date.type'='date',
            'projection.date.range'='2020-01-01,NOW',
            'projection.date.format'='yyyy-MM-dd',
            'projection.date.interval'='1',
            'projection.date.interval.unit'='DAYS',
            'storage.location.template'='{{.Location}}/date=${date}/'
          );

      topsql_sql_meta:
        ddl: |
          CREATE EXTERNAL TABLE `{{.Database}}`.`{{.Table}}` (
            `normalized_sql` STRING,
            `sql_digest` STRING
          )
          PARTITIONED BY (`date` STRING)
          ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
          STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
          OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
          LOCATION '{{.Location}}'
          TBLPROPERTIES (
            'parquet.compress'='ZSTD',
            'classification'='parquet',
            'projection.enabled'='true',
            'projection.date.type'='date',
            'projection.date.range'='2020-01-01,NOW',
            'projection.date.format'='yyyy-MM-dd',
            'projection.date.interval'='1',
            'projection.date.interval.unit'='DAYS',
            'storage.location.template'='{{.Location}}/date=${date}/'
          );

      topsql_topru:
        ddl: |
          CREATE EXTERNAL TABLE `{{.Database}}`.`{{.Table}}` (
            `keyspace` STRING,
            `plan_digest` STRING,
            `sql_digest` STRING,
            `timestamps` BIGINT,
            `topru_exec_count` BIGINT,
            `topru_exec_duration` BIGINT,
            `topru_total_ru` DOUBLE,
            `user` STRING
          )
          PARTITIONED BY (`instance` STRING, `date` STRING)
          ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
          STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
          OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
          LOCATION '{{.Location}}'
          TBLPROPERTIES (
            'parquet.compress'='ZSTD',
            'classification'='parquet',
            'projection.enabled'='true',
            'projection.date.type'='date',
            'projection.date.range'='2020-01-01,NOW',
            'projection.date.format'='yyyy-MM-dd',
            'projection.date.interval'='1',
            'projection.date.interval.unit'='DAYS',
            'projection.instance.type'='enum',
            'projection.instance.values'='{{.InstanceValues}}',
            'storage.location.template'='{{.Location}}/instance=${instance}/date=${date}/'
          );

      topru:
        type: view
        depends_on:
          - topsql_topru
          - topsql_sql_meta
          - topsql_plan_meta
        ddl: |
          CREATE OR REPLACE VIEW "{{.Database}}"."{{.Table}}" AS
          SELECT
            t."keyspace",
            t."plan_digest",
            t."sql_digest",
            t."timestamps",
            t."topru_exec_count",
            t."topru_exec_duration",
            t."topru_total_ru",
            t."user",
            t."instance",
            t."date",
            sm."normalized_sql",
            pm."normalized_plan",
            pm."encoded_normalized_plan"
          FROM "{{.Database}}"."{{.DepTopsqlTopru}}" t
          LEFT JOIN "{{.Database}}"."{{.DepTopsqlSqlMeta}}" sm
            ON t."sql_digest" = sm."sql_digest" AND t."date" = sm."date"
          LEFT JOIN "{{.Database}}"."{{.DepTopsqlPlanMeta}}" pm
            ON t."plan_digest" = pm."plan_digest" AND t."date" = pm."date"

      topsql:
        type: view
        depends_on:
          - topsql_tidb
          - topsql_tikv
          - topsql_sql_meta
          - topsql_plan_meta
        ddl: |
          CREATE OR REPLACE VIEW "{{.Database}}"."{{.Table}}" AS
          SELECT
            t."db",
            t."keyspace",
            t."plan_digest",
            t."region_id",
            t."sql_digest",
            t."table",
            t."table_id",
            t."tag_label",
            t."timestamps",
            t."topsql_cpu_time_ms",
            t."topsql_logical_read_bytes",
            t."topsql_logical_write_bytes",
            t."topsql_network_in_bytes",
            t."topsql_network_out_bytes",
            t."topsql_read_keys",
            t."topsql_stmt_duration_count",
            t."topsql_stmt_duration_sum_ns",
            t."topsql_stmt_exec_count",
            t."topsql_write_keys",
            t."instance",
            t."date",
            'tidb' AS "component",
            sm."normalized_sql",
            pm."normalized_plan",
            pm."encoded_normalized_plan"
          FROM "{{.Database}}"."{{.DepTopsqlTidb}}" t
          LEFT JOIN "{{.Database}}"."{{.DepTopsqlSqlMeta}}" sm
            ON t."sql_digest" = sm."sql_digest" AND t."date" = sm."date"
          LEFT JOIN "{{.Database}}"."{{.DepTopsqlPlanMeta}}" pm
            ON t."plan_digest" = pm."plan_digest" AND t."date" = pm."date"
          UNION ALL
          SELECT
            t."db",
            t."keyspace",
            t."plan_digest",
            t."region_id",
            t."sql_digest",
            t."table",
            t."table_id",
            t."tag_label",
            t."timestamps",
            t."topsql_cpu_time_ms",
            t."topsql_logical_read_bytes",
            t."topsql_logical_write_bytes",
            t."topsql_network_in_bytes",
            t."topsql_network_out_bytes",
            t."topsql_read_keys",
            t."topsql_stmt_duration_count",
            t."topsql_stmt_duration_sum_ns",
            t."topsql_stmt_exec_count",
            t."topsql_write_keys",
            t."instance",
            t."date",
            'tikv' AS "component",
            sm."normalized_sql",
            pm."normalized_plan",
            pm."encoded_normalized_plan"
          FROM "{{.Database}}"."{{.DepTopsqlTikv}}" t
          LEFT JOIN "{{.Database}}"."{{.DepTopsqlSqlMeta}}" sm
            ON t."sql_digest" = sm."sql_digest" AND t."date" = sm."date"
          LEFT JOIN "{{.Database}}"."{{.DepTopsqlPlanMeta}}" pm
            ON t."plan_digest" = pm."plan_digest" AND t."date" = pm."date"

gcp:
  enabled: false
  project_id: "gcp-cp-bigquery-dev"           # GCP 项目 ID
  bigquery_dataset: "clinic_data_proxy_dev"     # BigQuery 数据集名 Prefix（如 clinic_data_proxy）
  table_manager:
    enabled: true
    auto_create: true      # 自动创建外部表，Parquet 支持 Schema 自动识别
    cache_ttl_seconds: 0
    # 已存在的 Delta Lake 外部表 schema 自动刷新周期；0 表示关闭。
    schema_refresh_seconds: 300

alicloud:
  enabled: false
  # MaxCompute 引擎配置
  # endpoint 固定格式：https://service.{region}.maxcompute.aliyun.com/api
  # project = project_prefix + "_" + region（如 clinic_data_proxy_dev_ap_southeast_1）
  # 认证二选一：AK/SK 或 OIDC（EKS 无密钥）
  maxcompute:
    project_prefix: clinic_proxy_dev
    # Enable the native Parquet reader and row-group predicate pushdown only for
    # eligible slow-query Parquet SELECTs. Keep false until correctness/latency A/B.
    enable_slow_query_parquet_predicate_pushdown: false
    # Required for rollout safety: an empty list keeps the optimization disabled.
    slow_query_parquet_predicate_pushdown_regions: []
    # 方式1：AK/SK（本地/非 K8s 环境）
    access_key: ${ALICLOUD_ACCESS_KEY}
    secret_key: ${ALICLOUD_SECRET_KEY}
    # 方式2：OIDC 无密钥（EKS 等，使用 Pod service account token assume 到阿里云）
    # oidc_provider_arn: acs:ram::5480039859161595:oidc-provider/clinic-staging  # 阿里云 RAM OIDC IdP ARN
    # role_arn: acs:ram::5480039859161595:role/clinic-data-service                # RAM 角色 ARN
    # oidc_token_file: ./configs/token   # 默认路径，可省略
    # oidc_role_session_seconds: 1800    # AssumeRole 会话时长（秒），须 < K8s JWT TTL；默认 1800，最小 900
    # 自动创建 project（若不存在，需 odps:CreateProject 权限）
    auto_create_project: true
    project_product_type: payasyougo  # payasyougo/subscription/dev，默认 payasyougo
    sql_metering_max: 1   # 单次 SQL 消费上限（GB），默认 1
    auto_mv_quota_gb: 10  # 自动物化视图配额（GB），默认 10
  table_manager:
    enabled: true
    auto_create: true
    cache_ttl_seconds: 0
    table_templates:
      slow_query_logs:
        ddl: |
          CREATE EXTERNAL TABLE IF NOT EXISTS `{{.Database}}`.`{{.Table}}` (
            `id` BIGINT,
            `time` DOUBLE,
            `digest` STRING,
            `instance` STRING,
            `txn_start_ts` STRING,
            `user` STRING,
            `host` STRING,
            `conn_id` STRING,
            `session_alias` STRING,
            `exec_retry_count` STRING,
            `exec_retry_time` DOUBLE,
            `query_time` DOUBLE,
            `parse_time` DOUBLE,
            `compile_time` DOUBLE,
            `rewrite_time` DOUBLE,
            `preproc_subqueries` STRING,
            `preproc_subqueries_time` DOUBLE,
            `optimize_time` DOUBLE,
            `wait_ts` DOUBLE,
            `prewrite_time` DOUBLE,
            `wait_prewrite_binlog_time` DOUBLE,
            `commit_time` DOUBLE,
            `get_commit_ts_time` DOUBLE,
            `commit_backoff_time` DOUBLE,
            `backoff_types` STRING,
            `resolve_lock_time` DOUBLE,
            `local_latch_wait_time` DOUBLE,
            `write_keys` BIGINT,
            `write_size` BIGINT,
            `prewrite_region` BIGINT,
            `txn_retry` BIGINT,
            `cop_time` DOUBLE,
            `process_time` DOUBLE,
            `wait_time` DOUBLE,
            `backoff_time` DOUBLE,
            `lockkeys_time` DOUBLE,
            `request_count` STRING,
            `total_keys` STRING,
            `process_keys` STRING,
            `rocksdb_delete_skipped_count` STRING,
            `rocksdb_key_skipped_count` STRING,
            `rocksdb_block_cache_hit_count` STRING,
            `rocksdb_block_read_count` STRING,
            `rocksdb_block_read_byte` STRING,
            `db` STRING,
            `index_names` STRING,
            `is_internal` BOOLEAN,
            `stats` STRING,
            `cop_proc_avg` DOUBLE,
            `cop_proc_p90` DOUBLE,
            `cop_proc_max` DOUBLE,
            `cop_proc_addr` STRING,
            `cop_wait_avg` DOUBLE,
            `cop_wait_p90` DOUBLE,
            `cop_wait_max` DOUBLE,
            `cop_wait_addr` STRING,
            `mem_max` BIGINT,
            `disk_max` BIGINT,
            `kv_total` DOUBLE,
            `pd_total` DOUBLE,
            `backoff_total` DOUBLE,
            `write_sql_response_total` DOUBLE,
            `result_rows` BIGINT,
            `warnings` STRING,
            `backoff_detail` STRING,
            `prepared` BOOLEAN,
            `succ` BOOLEAN,
            `is_explicit_txn` BOOLEAN,
            `is_write_cache_table` BOOLEAN,
            `plan_from_cache` BOOLEAN,
            `plan_from_binding` BOOLEAN,
            `has_more_results` BOOLEAN,
            `resource_group` STRING,
            `request_unit_read` DOUBLE,
            `request_unit_write` DOUBLE,
            `time_queued_by_rc` DOUBLE,
            `plan_digest` STRING,
            `prev_stmt` STRING,
            `serverless_tenant_id` STRING,
            `serverless_project_id` STRING,
            `serverless_cluster_id` STRING,
            `worker_role` STRING,
            `is_tiflash` BOOLEAN,
            `query` STRING,
            `binary_plan` STRING,
            `plan` STRING,
            `decoded_plan` STRING
          )
          PARTITIONED BY (`date` STRING)
          STORED AS PARQUET
          LOCATION '{{.Location}}'

      topsql_tidb:
        ddl: |
          CREATE EXTERNAL TABLE IF NOT EXISTS `{{.Database}}`.`{{.Table}}` (
            `db` STRING,
            `keyspace` STRING,
            `plan_digest` STRING,
            `region_id` STRING,
            `sql_digest` STRING,
            `table` STRING,
            `table_id` BIGINT,
            `tag_label` STRING,
            `timestamps` BIGINT,
            `topsql_cpu_time_ms` INT,
            `topsql_logical_read_bytes` BIGINT,
            `topsql_logical_write_bytes` BIGINT,
            `topsql_network_in_bytes` BIGINT,
            `topsql_network_out_bytes` BIGINT,
            `topsql_read_keys` BIGINT,
            `topsql_stmt_duration_count` BIGINT,
            `topsql_stmt_duration_sum_ns` BIGINT,
            `topsql_stmt_exec_count` BIGINT,
            `topsql_write_keys` BIGINT
          )
          PARTITIONED BY (`instance` STRING, `date` STRING)
          STORED AS PARQUET
          LOCATION '{{.Location}}'

      topsql_tikv:
        ddl: |
          CREATE EXTERNAL TABLE IF NOT EXISTS `{{.Database}}`.`{{.Table}}` (
            `db` STRING,
            `keyspace` STRING,
            `plan_digest` STRING,
            `region_id` STRING,
            `sql_digest` STRING,
            `table` STRING,
            `table_id` BIGINT,
            `tag_label` STRING,
            `timestamps` BIGINT,
            `topsql_cpu_time_ms` INT,
            `topsql_logical_read_bytes` BIGINT,
            `topsql_logical_write_bytes` BIGINT,
            `topsql_network_in_bytes` BIGINT,
            `topsql_network_out_bytes` BIGINT,
            `topsql_read_keys` BIGINT,
            `topsql_stmt_duration_count` BIGINT,
            `topsql_stmt_duration_sum_ns` BIGINT,
            `topsql_stmt_exec_count` BIGINT,
            `topsql_write_keys` BIGINT
          )
          PARTITIONED BY (`instance` STRING, `date` STRING)
          STORED AS PARQUET
          LOCATION '{{.Location}}'

      topsql_plan_meta:
        ddl: |
          CREATE EXTERNAL TABLE IF NOT EXISTS `{{.Database}}`.`{{.Table}}` (
            `encoded_normalized_plan` STRING,
            `normalized_plan` STRING,
            `plan_digest` STRING
          )
          PARTITIONED BY (`date` STRING)
          STORED AS PARQUET
          LOCATION '{{.Location}}'

      topsql_sql_meta:
        ddl: |
          CREATE EXTERNAL TABLE IF NOT EXISTS `{{.Database}}`.`{{.Table}}` (
            `normalized_sql` STRING,
            `sql_digest` STRING
          )
          PARTITIONED BY (`date` STRING)
          STORED AS PARQUET
          LOCATION '{{.Location}}'

      topsql_topru:
        ddl: |
          CREATE EXTERNAL TABLE IF NOT EXISTS `{{.Database}}`.`{{.Table}}` (
            `keyspace` STRING,
            `plan_digest` STRING,
            `sql_digest` STRING,
            `timestamps` BIGINT,
            `topru_exec_count` BIGINT,
            `topru_exec_duration` BIGINT,
            `topru_total_ru` DOUBLE,
            `user` STRING
          )
          PARTITIONED BY (`instance` STRING, `date` STRING)
          STORED AS PARQUET
          LOCATION '{{.Location}}'

      topru:
        type: view
        depends_on:
          - topsql_topru
          - topsql_sql_meta
          - topsql_plan_meta
        ddl: |
          CREATE OR REPLACE VIEW `{{.Database}}`.`{{.Table}}` AS
          SELECT
            t.`keyspace`,
            t.`plan_digest`,
            t.`sql_digest`,
            t.`timestamps`,
            t.`topru_exec_count`,
            t.`topru_exec_duration`,
            t.`topru_total_ru`,
            t.`user`,
            t.`instance`,
            t.`date`,
            sm.`normalized_sql`,
            pm.`normalized_plan`,
            pm.`encoded_normalized_plan`
          FROM `{{.Database}}`.`{{.DepTopsqlTopru}}` t
          LEFT JOIN `{{.Database}}`.`{{.DepTopsqlSqlMeta}}` sm
            ON t.`sql_digest` = sm.`sql_digest` AND t.`date` = sm.`date`
          LEFT JOIN `{{.Database}}`.`{{.DepTopsqlPlanMeta}}` pm
            ON t.`plan_digest` = pm.`plan_digest` AND t.`date` = pm.`date`

      topsql:
        type: view
        depends_on:
          - topsql_tidb
          - topsql_tikv
          - topsql_sql_meta
          - topsql_plan_meta
        ddl: |
          CREATE OR REPLACE VIEW `{{.Database}}`.`{{.Table}}` AS
          SELECT
            t.`db`,
            t.`keyspace`,
            t.`plan_digest`,
            t.`region_id`,
            t.`sql_digest`,
            t.`table`,
            t.`table_id`,
            t.`tag_label`,
            t.`timestamps`,
            t.`topsql_cpu_time_ms`,
            t.`topsql_logical_read_bytes`,
            t.`topsql_logical_write_bytes`,
            t.`topsql_network_in_bytes`,
            t.`topsql_network_out_bytes`,
            t.`topsql_read_keys`,
            t.`topsql_stmt_duration_count`,
            t.`topsql_stmt_duration_sum_ns`,
            t.`topsql_stmt_exec_count`,
            t.`topsql_write_keys`,
            t.`instance`,
            t.`date`,
            'tidb' AS `component`,
            sm.`normalized_sql`,
            pm.`normalized_plan`,
            pm.`encoded_normalized_plan`
          FROM `{{.Database}}`.`{{.DepTopsqlTidb}}` t
          LEFT JOIN `{{.Database}}`.`{{.DepTopsqlSqlMeta}}` sm
            ON t.`sql_digest` = sm.`sql_digest` AND t.`date` = sm.`date`
          LEFT JOIN `{{.Database}}`.`{{.DepTopsqlPlanMeta}}` pm
            ON t.`plan_digest` = pm.`plan_digest` AND t.`date` = pm.`date`
          UNION ALL
          SELECT
            t.`db`,
            t.`keyspace`,
            t.`plan_digest`,
            t.`region_id`,
            t.`sql_digest`,
            t.`table`,
            t.`table_id`,
            t.`tag_label`,
            t.`timestamps`,
            t.`topsql_cpu_time_ms`,
            t.`topsql_logical_read_bytes`,
            t.`topsql_logical_write_bytes`,
            t.`topsql_network_in_bytes`,
            t.`topsql_network_out_bytes`,
            t.`topsql_read_keys`,
            t.`topsql_stmt_duration_count`,
            t.`topsql_stmt_duration_sum_ns`,
            t.`topsql_stmt_exec_count`,
            t.`topsql_write_keys`,
            t.`instance`,
            t.`date`,
            'tikv' AS `component`,
            sm.`normalized_sql`,
            pm.`normalized_plan`,
            pm.`encoded_normalized_plan`
          FROM `{{.Database}}`.`{{.DepTopsqlTikv}}` t
          LEFT JOIN `{{.Database}}`.`{{.DepTopsqlSqlMeta}}` sm
            ON t.`sql_digest` = sm.`sql_digest` AND t.`date` = sm.`date`
          LEFT JOIN `{{.Database}}`.`{{.DepTopsqlPlanMeta}}` pm
            ON t.`plan_digest` = pm.`plan_digest` AND t.`date` = pm.`date`

azure:
  enabled: false
  synapse:
    server: "clinic-synapse-prod-ondemand.sql.azuresynapse.net"
    port: 1433
    database: "master"
    auth_type: "aad_service_principal"
    tenant_id: "6c865c34-8ff8-4792-bbca-8c9d15efb29d"
    client_id: "${AZURE_CLIENT_ID}"
    client_secret: "${AZURE_CLIENT_SECRET}"
    query_timeout_seconds: 300
    max_open_conns: 10
    max_idle_conns: 5
    conn_max_lifetime_minutes: 30
# Loki Proxy 配置
loki_proxy:
  max_limit: 1000  # Loki 查询结果的最大限制，默认 1000
  # 管控面 / 系统日志 Loki endpoint。上线配置需在 app-delivery 中同步填充真实 URL。
  # default_system_datasource: "Loki-aws-us-west-2"
  # system_endpoints:
  #   - datasource: "Loki-aws-us-west-2"
  #     provider: "aws"
  #     region: "us-west-2"
  #     url: "${SYSTEM_LOKI_AWS_US_WEST_2_URL}"

# AI 分析配置
ai:
  clinic_api_key: "xxx"
  openai:
    api_key: "sk-proj-1Ervfxxx"
    model: "gpt-5.4"
  bedrock:
    region: "us-east-1"
    access_key_id: "AKIAW3CCYOxxxxxxx"
    secret_access_key: "5QHvxxxxxxxxxxx"
    model: "arn:aws:bedrock:us-east-1::inference-profile/global.anthropic.claude-opus-4-6-v1"
