From 0f9ba6bc92cc9255de8efd88733e9fd0491d8c34 Mon Sep 17 00:00:00 2001 From: hakeedra <1207097871@qq.com> Date: Thu, 11 Jul 2024 14:42:45 +0800 Subject: [PATCH 1/9] Docs: update milvus readme (#163) Signed-off-by: terry.wang --- catalog/milvus/apps/milvus.app/README.md | 4 +- .../milvus/apps/milvus.app/i18n/en/README.md | 2 +- catalog/milvus/x-definitions/app-milvus.cue | 52 ++++--------------- 3 files changed, 14 insertions(+), 44 deletions(-) diff --git a/catalog/milvus/apps/milvus.app/README.md b/catalog/milvus/apps/milvus.app/README.md index 1b1d367..898b8ff 100644 --- a/catalog/milvus/apps/milvus.app/README.md +++ b/catalog/milvus/apps/milvus.app/README.md @@ -43,7 +43,7 @@ pip install milvus-cli 1. 进入Milvus_CLI - ```shell +```shell milvus_cli ``` @@ -84,7 +84,7 @@ pip install milvus-cli list partitions -c car - drop partition -c car -p new_partition + delete partition -c car -p new_partition # 索引操作,注意:milvus_cli v0.4.3 创建索引为交互式操作,需要分别指定索引参数 milvus_cli > create index diff --git a/catalog/milvus/apps/milvus.app/i18n/en/README.md b/catalog/milvus/apps/milvus.app/i18n/en/README.md index a1b966d..e1a43a2 100644 --- a/catalog/milvus/apps/milvus.app/i18n/en/README.md +++ b/catalog/milvus/apps/milvus.app/i18n/en/README.md @@ -86,7 +86,7 @@ pip install milvus-cli list partitions -c car - drop partition -c car -p new_partition + delete partition -c car -p new_partition # index operation,notice:milvus_cli v0.4.3 creating index is an interactive operation that requires specifying index parameters separately milvus_cli > create index diff --git a/catalog/milvus/x-definitions/app-milvus.cue b/catalog/milvus/x-definitions/app-milvus.cue index e8a5577..c0e9628 100644 --- a/catalog/milvus/x-definitions/app-milvus.cue +++ b/catalog/milvus/x-definitions/app-milvus.cue @@ -151,7 +151,6 @@ template: { } } "standalone": { - "replicas": parameter.standalone.replicas "resources": parameter.standalone.resources "disk": { "enabled": true @@ -181,7 +180,7 @@ template: { } "proxy": { "enabled": true - "replicas": 1 + "replicas": parameter.proxy.replicas "resources": parameter.proxy.resources "profiling": { "enabled": true @@ -190,7 +189,6 @@ template: { } "rootCoordinator": { "enabled": true - "replicas": 1 "resources": parameter.rootCoordinator.resources "profiling": { "enabled": true @@ -202,7 +200,6 @@ template: { } "queryCoordinator": { "enabled": true - "replicas": 1 "resources": parameter.queryCoordinator.resources "profiling": { "enabled": true @@ -214,7 +211,7 @@ template: { } "queryNode": { "enabled": true - "replicas": 1 + "replicas": parameter.queryNode.replicas "resources": parameter.queryNode.resources "disk": { "enabled": true @@ -229,7 +226,6 @@ template: { } "indexCoordinator": { "enabled": true - "replicas": 1 "resources": parameter.indexCoordinator.resources "profiling": { "enabled": true @@ -241,7 +237,7 @@ template: { } "indexNode": { "enabled": true - "replicas": 1 + "replicas": parameter.indexNode.replicas "resources": parameter.indexNode.resources "profiling": { "enabled": true @@ -256,7 +252,6 @@ template: { } "dataCoordinator": { "enabled": true - "replicas": 1 "resources": parameter.dataCoordinator.resources "profiling": { "enabled": true @@ -268,7 +263,7 @@ template: { } "dataNode": { "enabled": true - "replicas": 1 + "replicas": parameter.dataNode.replicas "resources": parameter.dataNode.resources "profiling": { "enabled": false @@ -366,7 +361,7 @@ template: { parameter: { // +ui:order=0 // +ui:title=部署模式 - // +ui:description=False:standalone模式,True:cluster模式。注意: 目前Milvus单机版无法“在线”升级到Milvus集群。 + // +ui:description=False:standalone模式,True:cluster模式。注意: 应用安装后请勿修改部署模式。 clusterMode: *false | bool // +ui:order=1 // +ui:title=组件依赖 @@ -438,7 +433,7 @@ template: { } // +ui:description=副本数 // +ui:order=2 - // // +pattern=^([1-9]\d*)$ + // +pattern=^([3-9]\d*)$ // +err:options={"pattern":"请输入正确的副本数"} replicas: *3 | int // +ui:description=持久化存储配置 @@ -489,7 +484,7 @@ template: { } // +ui:description=副本数 // +ui:order=2 - // // +pattern=^([1-9]\d*)$ + // +pattern=^([1-9]\d*)$ // +err:options={"pattern":"请输入正确的副本数"} replicas: *1 | int } @@ -530,11 +525,6 @@ template: { memory: *"1024Mi" | string } } - // +ui:description=副本数 - // +ui:order=2 - // // +pattern=^([1-9]\d*)$ - // +err:options={"pattern":"请输入正确的副本数"} - replicas: *1 | int } // ui:title=ETCD 配置 @@ -573,11 +563,6 @@ template: { memory: *"1024Mi" | string } } - // +ui:description=副本数 - // +ui:order=2 - // // +pattern=^([1-9]\d*)$ - // +err:options={"pattern":"请输入正确的副本数"} - replicas: *1 | int } // ui:title=ETCD 配置 @@ -618,7 +603,7 @@ template: { } // +ui:description=副本数 // +ui:order=2 - // // +pattern=^([1-9]\d*)$ + // +pattern=^([1-9]\d*)$ // +err:options={"pattern":"请输入正确的副本数"} replicas: *1 | int } @@ -659,11 +644,6 @@ template: { memory: *"1024Mi" | string } } - // +ui:description=副本数 - // +ui:order=2 - // // +pattern=^([1-9]\d*)$ - // +err:options={"pattern":"请输入正确的副本数"} - replicas: *1 | int } // ui:title=ETCD 配置 @@ -704,7 +684,7 @@ template: { } // +ui:description=副本数 // +ui:order=2 - // // +pattern=^([1-9]\d*)$ + // +pattern=^([1-9]\d*)$ // +err:options={"pattern":"请输入正确的副本数"} replicas: *1 | int } @@ -745,11 +725,6 @@ template: { memory: *"1024Mi" | string } } - // +ui:description=副本数 - // +ui:order=2 - // // +pattern=^([1-9]\d*)$ - // +err:options={"pattern":"请输入正确的副本数"} - replicas: *1 | int } // ui:title=ETCD 配置 @@ -790,7 +765,7 @@ template: { } // +ui:description=副本数 // +ui:order=2 - // // +pattern=^([1-9]\d*)$ + // +pattern=^([1-9]\d*)$ // +err:options={"pattern":"请输入正确的副本数"} replicas: *1 | int } @@ -831,14 +806,9 @@ template: { memory: *"2048Mi" | string } } - // +ui:description=副本数 - // +ui:order=2 - // // +pattern=^([1-9]\d*)$ - // +err:options={"pattern":"请输入正确的副本数"} - replicas: *1 | int // +ui:description=存储大小 - // +ui:order=3 + // +ui:order=2 persistence: { // +pattern=^([1-9]\d*)(Ti|Gi|Mi)$ // +ui:order=1 From 68d6a10a93ba649fd0793e9953238db97132707d Mon Sep 17 00:00:00 2001 From: xingcan-ltc <166677246+xingcan-ltc@users.noreply.github.com> Date: Thu, 11 Jul 2024 15:16:23 +0800 Subject: [PATCH 2/9] Docs: fix user tutorials docs (#164) Signed-off-by: xingcan-ltc --- .../exploring-data-using-airbyte-clickhouse-superset.md | 2 +- ...nalysis-of-taobao's-maternal-and-infant-shopping-data.md | 6 +++--- .../exploring-data-using-airbyte-clickhouse-superset.md | 2 +- ...nalysis-of-taobao's-maternal-and-infant-shopping-data.md | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/en/user-tutorials/exploring-data-using-airbyte-clickhouse-superset.md b/docs/en/user-tutorials/exploring-data-using-airbyte-clickhouse-superset.md index 22cee2e..23a2f6d 100644 --- a/docs/en/user-tutorials/exploring-data-using-airbyte-clickhouse-superset.md +++ b/docs/en/user-tutorials/exploring-data-using-airbyte-clickhouse-superset.md @@ -82,7 +82,7 @@ select * from airbyte_internal.ods_tmall_order limit 10; ``` # 4. Data Display In Superset, we add a ClickHouse data source and create a dashboard. For instructions on how to add a data source and create a dashboard, refer to the Superset quick start guide. Below, we complete the data source and dashboard import using the panel import feature. -1. [Download the dashboard](https://gitee.com/linktime-cloud/example-datasets/blob/main/superset/dashboard_export_20240521T102107.zip) +1. [Download the dashboard](https://gitee.com/linktime-cloud/example-datasets/raw/main/superset/dashboard_export_20240521T102107.zip) 2. Import the dashboard - Select the downloaded file to import ![](./images/superset01.png) diff --git a/docs/en/user-tutorials/visualization-analysis-of-taobao's-maternal-and-infant-shopping-data.md b/docs/en/user-tutorials/visualization-analysis-of-taobao's-maternal-and-infant-shopping-data.md index 759f410..55e088e 100644 --- a/docs/en/user-tutorials/visualization-analysis-of-taobao's-maternal-and-infant-shopping-data.md +++ b/docs/en/user-tutorials/visualization-analysis-of-taobao's-maternal-and-infant-shopping-data.md @@ -65,10 +65,10 @@ We use the Airbyte component of the platform to synchronize data from the origin - User: `default` - Password: `ckdba.123` -4. Add a connection in Airbyte. Select `tianchi_mum_baby` as the source and ClickHouse as the destination, use the default configuration for the next step, set Schedule type to `Manual`, and then save. +4. Add a connection in Airbyte. Select `tianchi_mum_baby` as the source and ClickHouse as the destination, use the default configuration for the next step, set Schedule type to `Manual`, and then save. Manually click the sync button to synchronize data. ![](../../zh/user-tutorials/images/airbyte05.png) -5. Add a connection in Airbyte. Select `tianchi_mum_baby_trade_history` as the source and ClickHouse as the destination, use the default configuration for the next step, set Schedule type to `Manual`, and then save. +5. Add a connection in Airbyte. Select `tianchi_mum_baby_trade_history` as the source and ClickHouse as the destination, use the default configuration for the next step, set Schedule type to `Manual`, and then save. Manually click the sync button to synchronize data. 6. Check the job status in Airbyte. If successful, it means the data has been successfully imported into ClickHouse. ![](../../zh/user-tutorials/images/airbyte04.png) @@ -164,7 +164,7 @@ Log in to Superset `http://superset-kdp-data.kdp-e2e.io` (note to add local Host ## 5.1 Creating Charts ### Method One: Import the prepared charts (recommended) -1. [Download Dashboard](https://gitee.com/linktime-cloud/example-datasets/blob/main/superset/dashboard_export_20240607T100739.zip) +1. [Download Dashboard](https://gitee.com/linktime-cloud/example-datasets/raw/main/superset/dashboard_export_20240607T100739.zip) 2. Import Dashboard Select the downloaded file to import ![](../../zh/user-tutorials/images/superset01.png) diff --git a/docs/zh/user-tutorials/exploring-data-using-airbyte-clickhouse-superset.md b/docs/zh/user-tutorials/exploring-data-using-airbyte-clickhouse-superset.md index d27c0be..e9e43af 100644 --- a/docs/zh/user-tutorials/exploring-data-using-airbyte-clickhouse-superset.md +++ b/docs/zh/user-tutorials/exploring-data-using-airbyte-clickhouse-superset.md @@ -83,7 +83,7 @@ select * from airbyte_internal.ods_tmall_order limit 10; ``` # 4. 数据展示 在 Superset 中添加 clickhouse 数据源, 并制作面板。关于如何添加数据源,如何制作面板请参考 Superset quick start。下面我们通过面板的导入功能完成数据源,面板的导入。 -1. [下载面板](https://gitee.com/linktime-cloud/example-datasets/blob/main/superset/dashboard_export_20240521T102107.zip) +1. [下载面板](https://gitee.com/linktime-cloud/example-datasets/raw/main/superset/dashboard_export_20240521T102107.zip) 2. 导入面板 选择下载的文件导入 ![](./images/superset01.png) diff --git a/docs/zh/user-tutorials/visualization-analysis-of-taobao's-maternal-and-infant-shopping-data.md b/docs/zh/user-tutorials/visualization-analysis-of-taobao's-maternal-and-infant-shopping-data.md index d3f29fd..99c65c3 100644 --- a/docs/zh/user-tutorials/visualization-analysis-of-taobao's-maternal-and-infant-shopping-data.md +++ b/docs/zh/user-tutorials/visualization-analysis-of-taobao's-maternal-and-infant-shopping-data.md @@ -64,10 +64,10 @@ - User: `default` - Password: `ckdba.123` -4. 在 Airbyte 中添加一个 connection。source 选择 `tianchi_mum_baby`,destination 选择 ClickHouse,使用默认配置下一步,Schedule type 配置为 `Manual`,然后保存。 +4. 在 Airbyte 中添加一个 connection。source 选择 `tianchi_mum_baby`,destination 选择 ClickHouse,使用默认配置下一步,Schedule type 配置为 `Manual`,然后保存。手动点击同步按钮,同步数据。 ![](./images/airbyte05.png) -5. 在 Airbyte 中添加一个 connection。source 选择 `tianchi_mum_baby_trade_history`,destination 选择 ClickHouse,使用默认配置下一步,Schedule type 配置为 `Manual`,然后保存。 +5. 在 Airbyte 中添加一个 connection。source 选择 `tianchi_mum_baby_trade_history`,destination 选择 ClickHouse,使用默认配置下一步,Schedule type 配置为 `Manual`,然后保存。手动点击同步按钮,同步数据。 6. 查看 Airbyte 的 job 状态,如果成功,则说明数据已经成功导入到 ClickHouse 中。 ![](./images/airbyte04.png) @@ -160,7 +160,7 @@ Superset 支持 ClickHouse 数据源,我们可以通过 Superset 来可视化 ## 5.1 创建图表 ### 方式一:导入我们制作好的图表(建议) -1. [下载面板](https://gitee.com/linktime-cloud/example-datasets/blob/main/superset/dashboard_export_20240607T100739.zip) +1. [下载面板](https://gitee.com/linktime-cloud/example-datasets/raw/main/superset/dashboard_export_20240607T100739.zip) 2. 导入面板 选择下载的文件导入 ![](./images/superset01.png) From 81340c9cc3653c06fa57fc82bd31b74a2b7cec09 Mon Sep 17 00:00:00 2001 From: Zhao Yuanjie Date: Fri, 12 Jul 2024 14:01:44 +0800 Subject: [PATCH 3/9] Fix: scale ck memory limit to 8192Mi (#165) Signed-off-by: Zhao Yuanjie --- catalog/clickhouse/apps/clickhouse.app/app.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/catalog/clickhouse/apps/clickhouse.app/app.yaml b/catalog/clickhouse/apps/clickhouse.app/app.yaml index f3ddb4c..3ccbcd6 100644 --- a/catalog/clickhouse/apps/clickhouse.app/app.yaml +++ b/catalog/clickhouse/apps/clickhouse.app/app.yaml @@ -21,4 +21,4 @@ spec: memory: 512Mi limits: cpu: "4.0" - memory: 4096Mi \ No newline at end of file + memory: 8192Mi \ No newline at end of file From 9d783f201bdf2a3a316f5922c5ccf58a96b9b7d5 Mon Sep 17 00:00:00 2001 From: harlee-x Date: Sun, 14 Jul 2024 09:39:51 +0800 Subject: [PATCH 4/9] Fix: remove deprecated config for cloudtty job (#166) Signed-off-by: harlee-x --- infra/kdp-core/resources/kdp-cloudtty.cue | 4 ---- 1 file changed, 4 deletions(-) diff --git a/infra/kdp-core/resources/kdp-cloudtty.cue b/infra/kdp-core/resources/kdp-cloudtty.cue index 098c65b..45aaaee 100644 --- a/infra/kdp-core/resources/kdp-cloudtty.cue +++ b/infra/kdp-core/resources/kdp-cloudtty.cue @@ -60,10 +60,6 @@ _kdpTerminalConfigTask: { key: "create-kubeconfig" path: "create-kubeconfig.sh" }, - { - key: "terminal-ingress-template" - path: "terminal-ingress-template.yaml" - }, ] } }, From 595fdafc07fe2670d0bde99c5f4744cdb57e414b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jul 2024 11:49:42 +0800 Subject: [PATCH 5/9] Chore: (deps): Bump actions/setup-go from 5.0.1 to 5.0.2 (#169) Bumps [actions/setup-go](https://github.com/actions/setup-go) from 5.0.1 to 5.0.2. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/cdcb36043654635271a94b9a6d1392de5bb323a7...0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-build.yml | 6 +++--- .github/workflows/release.yml | 2 +- .github/workflows/unit-test.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 4749cea..e224857 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -44,7 +44,7 @@ jobs: steps: - name: Setup Go - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 with: go-version: ${{ env.GO_VERSION }} @@ -66,7 +66,7 @@ jobs: steps: - name: Setup Go - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 with: go-version: ${{ env.GO_VERSION }} @@ -96,7 +96,7 @@ jobs: submodules: true - name: Setup Go - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 with: go-version: ${{ env.GO_VERSION }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 803585e..4e3fedd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -49,7 +49,7 @@ jobs: make docker-push IMG_REGISTRY=${{ secrets.CONTAINER_REGISTRY }} - name: Set up Go - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 with: go-version: ${{ env.GO_VERSION }} cache: true diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index ca8ef2b..1a0744c 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -42,7 +42,7 @@ jobs: steps: - name: Set up Go - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 with: go-version: ${{ env.GO_VERSION }} From 7efb1b336931717099c2ed240b3d5e7daa382f71 Mon Sep 17 00:00:00 2001 From: xingcan-ltc <166677246+xingcan-ltc@users.noreply.github.com> Date: Fri, 19 Jul 2024 10:27:56 +0800 Subject: [PATCH 6/9] Feat: add Ollama app (#149) Signed-off-by: xingcan-ltc --- catalog/airflow/app-flink.cue | 485 ++++++++++++++++++ catalog/ollama/README.md | 19 + catalog/ollama/apps/ollama.app/README.md | 153 ++++++ catalog/ollama/apps/ollama.app/app.yaml | 16 + .../ollama/apps/ollama.app/i18n/en/README.md | 154 ++++++ catalog/ollama/apps/ollama.app/metadata.yaml | 8 + catalog/ollama/i18n/en/README.md | 18 + catalog/ollama/metadata.yaml | 8 + catalog/ollama/x-definitions/app-ollama.cue | 193 +++++++ 9 files changed, 1054 insertions(+) create mode 100644 catalog/airflow/app-flink.cue create mode 100644 catalog/ollama/README.md create mode 100644 catalog/ollama/apps/ollama.app/README.md create mode 100644 catalog/ollama/apps/ollama.app/app.yaml create mode 100644 catalog/ollama/apps/ollama.app/i18n/en/README.md create mode 100644 catalog/ollama/apps/ollama.app/metadata.yaml create mode 100644 catalog/ollama/i18n/en/README.md create mode 100644 catalog/ollama/metadata.yaml create mode 100644 catalog/ollama/x-definitions/app-ollama.cue diff --git a/catalog/airflow/app-flink.cue b/catalog/airflow/app-flink.cue new file mode 100644 index 0000000..6a4e19c --- /dev/null +++ b/catalog/airflow/app-flink.cue @@ -0,0 +1,485 @@ +flink: { + annotations: {} + labels: {} + attributes: { + dynamicParameterMeta: [ + { + name: "ha.zookeeper.quorum" + type: "ContextSetting" + refType: "zookeeper" + refKey: "hostname" + description: "zookeeper url" + required: false + }, + { + name: "ha.zookeeper.port" + type: "ContextSetting" + refType: "zookeeper" + refKey: "port" + description: "zookeeper port" + required: false + }, + { + name: "ha.storage.hdfs.configName" + type: "ContextSetting" + refType: "hdfs" + refKey: "" + description: "flink ha hdfs config name" + required: false + }, + { + name: "hive.hmsConfigName" + type: "ContextSetting" + refType: "hive-metastore" + refKey: "" + description: "hive hms config name" + required: false + }, + { + name: "hive.hdfsConfigName" + type: "ContextSetting" + refType: "hdfs" + refKey: "" + description: "hive hdfs config name" + required: false + }, + ] + apiResource: { + definition: { + apiVersion: "bdc.kdp.io/v1alpha1" + kind: "Application" + type: "flink" + } + } + } + description: "flink" + type: "xdefinition" +} + +template: { + output: { + + apiVersion: "core.oam.dev/v1beta1" + kind: "Application" + metadata: { + name: context["name"] + namespace: context["namespace"] + } + spec: { + components: [ + {name: context.name + type: "raw" + properties: { + // https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-release-1.7/docs/custom-resource/reference/ + kind: "FlinkDeployment" + apiVersion: "flink.apache.org/v1beta1" + metadata: { + name: context.name + namespace: context.namespace + } + spec: { + flinkConfiguration: { + + if parameter.metrics.enable && "\(parameter.flinkVersion)" == "v1_17" { + "metrics.reporter.prom.factory.class": "org.apache.flink.metrics.prometheus.PrometheusReporterFactory" + "metrics.reporter.prom.port": "9249" + } + if parameter.ha.enable && "\(parameter.ha.type)" == "zookeeper" { + "high-availability.type": "zookeeper" + "high-availability.zookeeper.quorum": parameter.ha.zookeeper.quorum + ":" + parameter.ha.zookeeper.port + "high-availability.zookeeper.path.root": "/flink/" + context.namespace + "/" + context.name + } + if parameter.ha.enable && "\(parameter.ha.type)" == "kubernetes" { + "high-availability.type": "kubernetes" + // Operator 禁止更新下面的key: + // - "high-availability.cluster-id" + // - "kubernetes.cluster-id": + } + if parameter.ha.enable && "\(parameter.ha.storage.type)" == "hdfs" { + "high-availability.storageDir": "hdfs:///flink/recovery/" + context.namespace + "state.backend": "filesystem" + "state.checkpoints.dir": "hdfs:///flink/checkpoints/" + context.namespace + "state.savepoints.dir": "hdfs:///flink/savepoints/" + context.namespace + "kubernetes.hadoop.conf.config-map.name": parameter.ha.storage.hdfs.configName + } + if parameter.ha.enable && "\(parameter.ha.storage.type)" == "s3" { + "high-availability.storageDir": "s3://" + parameter.ha.storage.s3.bucket + "/recovery/" + context.namespace + "state.backend": "filesystem" + "state.checkpoints.dir": "s3://" + parameter.ha.storage.s3.bucket + "/checkpoints/" + context.namespace + "state.savepoints.dir": "s3://" + parameter.ha.storage.s3.bucket + "/savepoints/" + context.namespace + "s3.endpoint": parameter.ha.storage.s3.endpoint + "s3.access.key": parameter.ha.storage.s3.accesskey + "s3.secret.key": parameter.ha.storage.s3.secretkey + "s3.path.style.access": "true" + } + if parameter.extraFlinkConfiguration != _|_ { + for k, v in parameter.extraFlinkConfiguration { + "\(k)": v + } + } + } + flinkVersion: parameter.flinkVersion + image: context["docker_registry"] + "/" + parameter.flink17Image + + serviceAccount: parameter.serviceAccount + jobManager: { + resource: { + cpu: parameter.jobManager.resources.cpu + memory: parameter.jobManager.resources.memory + } + } + taskManager: { + resource: { + cpu: parameter.taskManager.resources.cpu + memory: parameter.taskManager.resources.memory + } + } + podTemplate: spec: { + affinity: {} + _hiveVolumes: [...] + if parameter.hive.enable { + _hiveVolumes: [ + { + name: "flink-hms-config" + configMap: { + name: parameter.hive.hmsConfigName + } + }, { + name: "flink-hms-hdfs-config" + configMap: { + name: parameter.hive.hdfsConfigName + } + }, + ] + } + volumes: [] + _hiveVolumes + containers: [ + { + name: "flink-main-container" + if parameter.metrics.enable { + ports: [ + { + name: "metrics" + containerPort: 9249 + protocol: "TCP" + }, + ] + } + _hiveVolumeMounts: [...] + if parameter.hive.enable { + _hiveVolumeMounts: [ + { + "name": "flink-hms-config" + "mountPath": "/opt/hive-conf" + }, { + "name": "flink-hms-hdfs-config" + "mountPath": "/opt/hdfs-conf" + }, + ] + } + volumeMounts: [] + _hiveVolumeMounts + }, + ] + } + } + } + + traits: [ + { + type: "bdos-monitor" + properties: { + monitortype: "pod" + endpoints: [ + { + port: 9249 + path: "/" + portName: "metrics" + }, + ] + matchLabels: { + app: context.name + } + } + }, + { + type: "bdos-ingress" + properties: { + rules: [ + { + host: context["name"] + "-" + context["namespace"] + "." + context["ingress.root_domain"] + paths: [ + { + path: "/" + servicePort: 8081 + serviceName: context.name + "-rest" + }, + ] + }, + ] + tls: [ + { + hosts: [ + context["name"] + "-" + context["namespace"] + "." + context["ingress.root_domain"], + ] + tlsSecretName: context["ingress.tls_secret_name"] + }, + ] + } + }, + ] + }, + { + name: "flink-service-account" + properties: { + apiVersion: "v1" + kind: "ServiceAccount" + metadata: { + name: "flink" + namespace: context.namespace + } + } + type: "raw" + }, + { + name: "flink-role" + properties: { + rules: [ + { + apiGroups: [ + "*", + ] + resources: [ + "pods", + "services", + "configmaps", + ] + verbs: [ + "get", + "watch", + "list", + "create", + "update", + "patch", + "delete", + ] + }, + { + apiGroups: [ + "apps", + ] + resources: [ + "deployments", + "deployments/finalizers", + ] + verbs: [ + "*", + ] + }, + ] + } + type: "bdos-role" + }, + { + name: "flink-rolebinding" + properties: { + roleName: "flink-role" + serviceAccounts: [ + { + namespace: context.namespace + serviceAccountName: "flink" + }, + ] + } + type: "bdos-role-binding" + }, + ] + policies: [ + { + name: "shared-resource" + properties: { + rules: [ + { + selector: { + componentNames: [ + "flink-role", + ] + } + }, + { + selector: { + componentNames: [ + "flink-rolebinding", + ] + } + }, + { + selector: { + componentNames: [ + "flink-service-account", + ] + } + }, + ] + } + type: "shared-resource" + }, + ] + } + } + + parameter: { + // +ui:description=Flink版本 + // +ui:order=1 + // +ui:options={"disabled": true} + flinkVersion: *"v1_17" | string + + // +ui:title=image + // +ui:description=镜像 + // +ui:order=2 + // +ui:hidden={{rootFormData.flinkVersion != "v1_17"}} + // +ui:options={"disabled": true} + flink17Image: string + + // +ui:description=job manager资源配置 + // +ui:order=3 + jobManager: { + // +ui:description=资源规格 + resources: { + // pattern: ^[0-9]+(\.[0-9])?$ + // +err:options={"pattern":"请输入正确的cpu资源配置, 如0.1"} + // +ui:description=CPU + cpu: *0.1 | float + + // pattern: ^[0-9]+[m|g]$ + // +err:options={"pattern":"请输入正确的内存资源配置, 如2048m, 2g"} + // +ui:description=内存 + memory: *"2048m" | string + } + } + + // +ui:description=task manager资源配置 + // +ui:order=4 + taskManager: { + // +ui:description=资源规格 + resources: { + // pattern: ^[0-9]+(\.[0-9])?$ + // +err:options={"pattern":"请输入正确的cpu资源配置, 如0.1"} + // +ui:description=CPU + cpu: *0.5 | float + + // pattern: ^[0-9]+[m|g]$ + // +err:options={"pattern":"请输入正确的内存资源配置, 如2048m, 2g"} + // +ui:description=内存 + memory: *"2048m" | string + } + } + + // +ui:title=高可用配置 + // +ui:order=5 + ha: { + // +ui:description=是否启用高可用, 生产环境建议启用 + // +ui:order=1 + enable: *true | bool + + // +ui:description=选择高可用类型,支持kubernetes和zookeeper + // +ui:hidden={{rootFormData.ha.enable == false}} + // +ui:order=2 + type: "kubernetes" | "zookeeper" + + // +ui:description=使用zookeeper作为高可用 + // +ui:hidden={{rootFormData.ha.type != "zookeeper"}} + // +ui:order=3 + zookeeper: { + + // +ui:description=Zookeeper hostname + // +err:options={"required":"请先安装zookeeper"} + quorum: string + + // +ui:description=端口 + // +err:options={"required":"请先安装zookeeper"} + port: string + } + + // +ui:description=配置高可用元数据的存储 + // +ui:hidden={{rootFormData.ha.enable == false}} + // +ui:order=3 + storage: { + // +ui:title=存储类型 + // +ui:description=选择高可用元数据的存储位置,支持hdfs和s3 + // +ui:order=1 + type: "hdfs" | "s3" + + // +ui:description=配置hdfs作为高可用元数据的存储 + // +ui:hidden={{rootFormData.ha.storage.type != "hdfs"}} + // +ui:order=2 + hdfs: { + // +ui:description=配置hdfs依赖 + // +ui:hidden={{rootFormData.ha.storage.type != "hdfs"}} + // +err:options={"required":"存储依赖hdfs, 请先安装hdfs"} + configName: string + } + + // +ui:description=配置S3作为高可用元数据的存储 + // +ui:hidden={{rootFormData.ha.storage.type != "s3"}} + // +ui:order=3 + s3: { + // +ui:options={"description":"请输入S3 endpoint, 如 http://minio:9000"} + // +ui:order=1 + endpoint: string + + // +ui:options={"description":"请输入S3 bucket, 如 kdp-flink-checkpoint, 请确保bucket已创建"} + // +ui:order=2 + bucket: string + + // +ui:options={"description":"请输入S3 accesskey, 如 minio用户名, 请确保用户有bucket的读写权限"} + // +ui:order=3 + accesskey: string + + // +ui:options={"description":"请输入S3 secretkey, 如 minio用户密码"} + // +ui:order=4 + secretkey: string + } + + } + + } + + // +ui:title=指标配置 + // +ui:description=开启指标采集,供grafana展示 + // +ui:order=5 + // +ui:hidden=true + metrics: { + enable: *true | bool + } + + // +ui:title=ServiceAccount配置 + // +ui:description=配置flink的k8s serviceAccount + // +ui:order=6 + // +ui:hidden=true + serviceAccount: *"flink" | string + + // +ui:title=Flink on Hive配置 + // +ui:order=8 + hive: { + // +ui:description=是否启用Flink on Hive + // +ui:order=1 + enable: *false | bool + + // +minLength=3 + // +ui:description=配置Hive Metastore依赖 + // +ui:hidden={{rootFormData.hive.enable == false}} + // +err:options={"required":"请先安装hive-metastore"} + hmsConfigName: string + + // +ui:description=配置HDFS依赖 + // +ui:hidden={{rootFormData.hive.enable == false}} + // +err:options={"required":"请先安装hdfs"} + hdfsConfigName: string + } + + // +ui:description=配置conf/flink-conf.yaml, 请参考官方文档:https://nightlies.apache.org/flink/flink-docs-master/docs/deployment/config/ + // +ui:order=9 + extraFlinkConfiguration?: {...} + } + +} diff --git a/catalog/ollama/README.md b/catalog/ollama/README.md new file mode 100644 index 0000000..0d89fad --- /dev/null +++ b/catalog/ollama/README.md @@ -0,0 +1,19 @@ +### 1. 介绍 +Ollama 是一个简单易用且开源的本地大模型运行平台。。 + +### 2. 产品特性 +#### 丰富的模型库与高效管理 +Ollama提供了一个多样化且不断扩展的预训练大型语言模型库,涵盖从通用模型到特定领域专用模型的广泛选择。用户可以轻松下载和管理这些模型,无需处理复杂的格式或依赖问题,使得模型部署变得简单快捷。 + +#### 本地API与无缝集成 +Ollama提供了一个本地API接口,使开发者能够将大型语言模型无缝集成到他们的应用程序和工作流程中。这一API不仅简化了应用程序与模型之间的通信,还释放了LLM的全部潜力,为用户提供了强大的AI支持。 + +#### 深度的定制与微调能力 +Ollama赋予用户广泛的定制选项,允许他们对LLM的参数进行微调,调整设置,并根据特定需求和偏好定制模型的行为。这种级别的控制确保了模型的最佳性能,并支持用户探索和实验不同的模型配置。 + +#### 硬件加速与性能优化 +考虑到LLM的计算需求,Ollama智能地利用可用的硬件资源,包括GPU和CPU,以加速推理过程并优化性能。这确保了机器资源的高效利用,使得用户即使在运行大规模LLM时也能体验到流畅的性能。 + +#### 离线访问与隐私保护 +Ollama的一个关键优势是其能够在完全离线状态下运行,无需互联网连接。这不仅保证了不间断的访问和生产力,还通过将数据安全地保留在本地环境中,解决了隐私方面的担忧。 + diff --git a/catalog/ollama/apps/ollama.app/README.md b/catalog/ollama/apps/ollama.app/README.md new file mode 100644 index 0000000..e68cfb5 --- /dev/null +++ b/catalog/ollama/apps/ollama.app/README.md @@ -0,0 +1,153 @@ +### 1. 简介 +Ollama [开源项目](https://github.com/ollama/ollama) 是一个简单易用且开源的本地大模型运行平台。 + +### 2. 快速开始 + +#### 2.1 安装模型 +在 KDP 页面安装的时候`模型列表`参数默认是空值,可以在[这里](https://ollama.com/library)找到需要的模型,填写模型名称即可,点击安装后会在应用启动阶段自动下载模型。通常模型比较大,下载时间较长,请耐心等待(无法查看进度)。或者保持`模型列表`参数是空值,安装启动后进入容器手动下载(以下载`qwen:0.5b`为例): +`kubectl exec -it $(kubectl get pods -l app.kubernetes.io/name=ollama -n kdp-data -o jsonpath='{.items[0].metadata.name}') -n kdp-data -- ollama pull qwen:0.5b` + +#### 2.2 使用 REST API + +```bash + +export ollama_endpoint=http://ollama-kdp-data.kdp-e2e.io +export ollama_model=qwen:0.5b + +curl ${ollama_endpoint}/api/generate -d '{ + "model": "'"${ollama_model}"'", + "prompt": "Why is the sky blue?" +}' + +``` +高级参数:https://github.com/ollama/ollama/blob/main/docs/api.md#generate-request-with-options +更多请参考: https://github.com/ollama/ollama/blob/main/docs/api.md + + +#### 2.3 使用 Python SDK + +- Install + +```sh +# Python version >= 3.8 +pip install ollama +``` + +- Usage + +```python +import ollama +response = ollama.chat(model='qwen:0.5b', messages=[ + { + 'role': 'user', + 'content': 'Why is the sky blue?', + }, +]) +print(response['message']['content']) +``` +参考文档:https://github.com/ollama/ollama-python +另外 JavaScript SDK:https://github.com/ollama/ollama-js + + +更多使用示例:https://github.com/ollama/ollama/blob/main/docs/tutorials.md + +### 3. 常用命令 +```bash +export ollama_model=qwen:0.5b +# download model +ollama pull ${ollama_model} +# list models +ollama list +# run model +ollama run ${ollama_model} +# list running models +ollama ps +# delete model +ollama rm ${ollama_model} + +``` +### 4. Open AI 兼容性 +Ollama 部分兼容 OpenAI API,您可以使用 OpenAI SDK 与 Ollama 进行交互。参考 https://github.com/ollama/ollama/blob/main/docs/openai.md + +```py +from openai import OpenAI + +client = OpenAI( + base_url='http://ollama-kdp-data.kdp-e2e.io/v1/', + + # required but ignored + api_key='ollama', +) + +chat_completion = client.chat.completions.create( + messages=[ + { + 'role': 'user', + 'content': 'Say this is a test', + } + ], + model='qwen:0.5b', +) +``` + +### 5. GPU 兼容性 +https://github.com/ollama/ollama/blob/main/docs/gpu.md + + +### 6. 自定义模型 + +```bash +# download model +ollama pull qwen:0.5b + +# create model file +cat > Modelfile << EOF +FROM qwen:0.5b +# set the temperature to 1 [higher is more creative, lower is more coherent] +PARAMETER temperature 1 +# set the system message +SYSTEM """ +You are Mario from Super Mario Bros. Answer as Mario, the assistant, only. +""" +EOF + +# build model +ollama create mario -f ./Modelfile + +# run model +ollama run mario +>>> hi +Hello! It's your friend Mario. +``` + +更多参考: https://github.com/ollama/ollama/blob/main/docs/modelfile.md + + +### 7. 自定义 Ollama docker image +如果部署环境无法下载模型,可以构建自定义 Ollama docker image。 + +```bash +# wire Dockerfile +cat > Dockerfile << EOF +FROM ollama/ollama:latest +RUN ollama pull qwen:0.5b +EOF + +docker build -t ollama-custom:1.0.0 . +docker push ollama-custom:1.0.0 +``` +在`catalog/ollama/x-definitions/app-ollama.cue`文件中新增`tag`配置 + +```cue +values: { + image: { + repository: "\(_imageRegistry)ollama/ollama" + // use custom image + tag: "ollama-custom:1.0.0" + } + .... +} +``` + +### 7. FAQ +https://github.com/ollama/ollama/blob/main/docs/faq.md diff --git a/catalog/ollama/apps/ollama.app/app.yaml b/catalog/ollama/apps/ollama.app/app.yaml new file mode 100644 index 0000000..b6b78b4 --- /dev/null +++ b/catalog/ollama/apps/ollama.app/app.yaml @@ -0,0 +1,16 @@ +apiVersion: bdc.kdp.io/v1alpha1 +kind: Application +metadata: + annotations: + app.core.bdos/catalog: ollama + labels: + app: ollama + app.core.bdos/type: system +spec: + name: ollama + type: ollama + properties: + replicaCount: 1 + ollama: + gpu: + type: nvidia diff --git a/catalog/ollama/apps/ollama.app/i18n/en/README.md b/catalog/ollama/apps/ollama.app/i18n/en/README.md new file mode 100644 index 0000000..8e82943 --- /dev/null +++ b/catalog/ollama/apps/ollama.app/i18n/en/README.md @@ -0,0 +1,154 @@ +### 1. Introduction +Ollama [open-source project](https://github.com/ollama/ollama) is a user-friendly and open-source platform for running large models locally. + +### 2. Quick Start + +#### 2.1 Installing Models +When installing on the KDP page, the `model list` parameter defaults to an empty value. You can find the required models [here](https://ollama.com/library) and simply fill in the model name. After clicking install, the model will be automatically downloaded during the application startup phase. Typically, models are large and may take a long time to download, so please be patient (progress cannot be viewed). Alternatively, you can keep the `model list` parameter empty, install and start the application, and then manually download the model inside the container (taking `qwen:0.5b` as an example): +```shell +kubectl exec -it $(kubectl get pods -l app.kubernetes.io/name=ollama -n kdp-data -o jsonpath='{.items[0].metadata.name}') -n kdp-data -- ollama pull qwen:0.5b +``` + +#### 2.2 Using the REST API + +```bash + +export ollama_endpoint=http://ollama-kdp-data.kdp-e2e.io +export ollama_model=qwen:0.5b + + +curl ${ollama_endpoint}/api/generate -d '{ + "model": "'"${ollama_model}"'", + "prompt": "Why is the sky blue?" +}' + +``` +高级参数:https://github.com/ollama/ollama/blob/main/docs/api.md#generate-request-with-options +更多请参考: https://github.com/ollama/ollama/blob/main/docs/api.md + + +#### 2.3 Using Python SDK + +- Install + +```sh +# Python version >= 3.8 +pip install ollama +``` + +- Usage + +```python +import ollama +response = ollama.chat(model='qwen:0.5b', messages=[ + { + 'role': 'user', + 'content': 'Why is the sky blue?', + }, +]) +print(response['message']['content']) +``` +Reference Documentation: [Ollama Python SDK](https://github.com/ollama/ollama-python) +Additionally, JavaScript SDK: [Ollama JS](https://github.com/ollama/ollama-js) + +More usage examples: [Tutorials](https://github.com/ollama/ollama/blob/main/docs/tutorials.md) + +### 3. Common Commands +```bash +export ollama_model=qwen:0.5b +# download model +ollama pull ${ollama_model} +# list models +ollama list +# run model +ollama run ${ollama_model} +# list running models +ollama ps +# delete model +ollama rm ${ollama_model} + +``` +### 4. OpenAI Compatibility +Ollama is partially compatible with the OpenAI API, allowing you to interact with Ollama using the OpenAI SDK. Refer to [OpenAI Compatibility Documentation](https://github.com/ollama/ollama/blob/main/docs/openai.md) for more details. + +```py +from openai import OpenAI + +client = OpenAI( + base_url='http://ollama-kdp-data.kdp-e2e.io/v1/', + + # required but ignored + api_key='ollama', +) + +chat_completion = client.chat.completions.create( + messages=[ + { + 'role': 'user', + 'content': 'Say this is a test', + } + ], + model='qwen:0.5b', +) +``` + +### 5. GPU Compatibility +For GPU compatibility details, please refer to the [GPU Documentation](https://github.com/ollama/ollama/blob/main/docs/gpu.md). + +### 6. Custom Models + +```bash +# download model +ollama pull qwen:0.5b + +# create model file +cat > Modelfile << EOF +FROM qwen:0.5b +# set the temperature to 1 [higher is more creative, lower is more coherent] +PARAMETER temperature 1 +# set the system message +SYSTEM """ +You are Mario from Super Mario Bros. Answer as Mario, the assistant, only. +""" +EOF + +# build model +ollama create mario -f ./Modelfile + +# run model +ollama run mario +>>> hi +Hello! It's your friend Mario. +``` + +For more references on custom models, see [Model File Documentation](https://github.com/ollama/ollama/blob/main/docs/modelfile.md). + +### 7. Custom Ollama Docker Image +If your deployment environment cannot download models, you can build a custom Ollama Docker image. + +```bash +# wire Dockerfile +cat > Dockerfile << EOF +FROM ollama/ollama:latest +RUN ollama pull qwen:0.5b +EOF + +docker build -t ollama-custom:1.0.0 . +docker push ollama-custom:1.0.0 +``` + +Add the `tag` configuration in the `catalog/ollama/x-definitions/app-ollama.cue` file. + +```cue +values: { + image: { + repository: "\(_imageRegistry)ollama/ollama" + // use custom image + tag: "ollama-custom:1.0.0" + } + .... +} +``` + +### 7. FAQ +https://github.com/ollama/ollama/blob/main/docs/faq.md diff --git a/catalog/ollama/apps/ollama.app/metadata.yaml b/catalog/ollama/apps/ollama.app/metadata.yaml new file mode 100644 index 0000000..9df9714 --- /dev/null +++ b/catalog/ollama/apps/ollama.app/metadata.yaml @@ -0,0 +1,8 @@ +version: 0.1.48 +alias: Ollama +description: Ollama 是一个简单易用且开源的本地大模型运行平台。 +isGlobal: false +i18n: + en: + description: >- + Ollama is an open-source project that serves as a powerful and user-friendly platform for running Large Language Models (LLMs) on your local machine. \ No newline at end of file diff --git a/catalog/ollama/i18n/en/README.md b/catalog/ollama/i18n/en/README.md new file mode 100644 index 0000000..cf8a651 --- /dev/null +++ b/catalog/ollama/i18n/en/README.md @@ -0,0 +1,18 @@ +### 1. Introduction +Ollama is an open-source project that serves as a powerful and user-friendly platform for running Large Language Models (LLMs) on your local machine. + +### 2. Product Features +#### Rich Model Library and Efficient Management +Ollama offers a diverse and continuously expanding library of pre-trained LLM models, ranging from versatile general-purpose models to specialized ones tailored for specific domains or tasks. Users can easily download and manage these models without dealing with complex formats or dependencies, making model deployment simple and swift. + +#### Local API and Seamless Integration +Ollama provides a local API interface, enabling developers to seamlessly integrate LLMs into their applications and workflows. This API not only simplifies communication between applications and models but also unlocks the full potential of LLMs, providing robust AI support to users. + +#### Deep Customization and Fine-tuning Capabilities +Ollama empowers users with extensive customization options, allowing them to fine-tune LLM parameters, adjust settings, and tailor the models' behavior to align with specific needs and preferences. This level of control ensures optimal model performance and supports users in exploring and experimenting with different model configurations. + +#### Hardware Acceleration and Performance Optimization +Recognizing the computational demands of LLMs, Ollama intelligently leverages available hardware resources, including GPUs and CPUs, to accelerate inference and optimize performance. This ensures efficient utilization of machine resources, enabling users to experience smooth performance even when running large-scale LLMs. + +#### Offline Access and Privacy Protection +One of the key advantages of Ollama is its ability to operate entirely offline, without the need for an internet connection. This not only ensures uninterrupted access and productivity but also addresses privacy concerns by keeping data securely within the local environment. \ No newline at end of file diff --git a/catalog/ollama/metadata.yaml b/catalog/ollama/metadata.yaml new file mode 100644 index 0000000..cc00022 --- /dev/null +++ b/catalog/ollama/metadata.yaml @@ -0,0 +1,8 @@ +name: Ollama +category: 大型语言模型 +description: Ollama 是一个简单易用且开源的本地大模型运行平台。。 +i18n: + en: + category: system.llm + description: >- + Ollama is an open-source project that serves as a powerful and user-friendly platform for running Large Language Models (LLMs) on your local machine. diff --git a/catalog/ollama/x-definitions/app-ollama.cue b/catalog/ollama/x-definitions/app-ollama.cue new file mode 100644 index 0000000..72e48ea --- /dev/null +++ b/catalog/ollama/x-definitions/app-ollama.cue @@ -0,0 +1,193 @@ +"ollama": { + annotations: {} + labels: {} + attributes: { + dynamicParameterMeta: [ + ] + apiResource: { + definition: { + apiVersion: "bdc.kdp.io/v1alpha1" + kind: "Application" + type: "ollama" + } + } + } + description: "ollama" + type: "xdefinition" +} + +template: { + _imageRegistry: *"" | string + if context.docker_registry != _|_ && len(context.docker_registry) > 0 { + _imageRegistry: context.docker_registry + "/" + } + _ingressHost: context["name"] + "-" + context["namespace"] + "." + context["ingress.root_domain"] + + output: { + apiVersion: "core.oam.dev/v1beta1" + kind: "Application" + metadata: { + name: context["name"] + namespace: context["namespace"] + } + spec: { + components: [ + { + name: context["name"] + properties: { + chart: "ollama" // https://github.com/otwld/ollama-helm + releaseName: context["name"] + repoType: "oci" + targetNamespace: context["namespace"] + url: context["helm_repo_url"] + version: "0.40.0" + values: { + image: { + repository: "\(_imageRegistry)ollama/ollama" + } + replicaCount: parameter.replicaCount + ollama: { + gpu: { + enabled: parameter.ollama.gpu.enabled + // -- GPU type: 'nvidia' or 'amd' + // If 'ollama.gpu.enabled', default value is nvidia + // If set to 'amd', this will add 'rocm' suffix to image tag if 'image.tag' is not override + // This is due cause AMD and CPU/CUDA are different images + type: "\(parameter.ollama.gpu.type)" + + //-- Specify the number of GPU + "number": parameter.ollama.gpu.number + } + models: parameter.ollama.models + } + + persistentVolume: { + enabled: parameter.persistentVolume.enabled + size: parameter.persistentVolume.size + storageClass: context["storage_config.storage_class_mapping.local_disk"] + } + + if parameter.resources != _|_ { + resources: parameter.resources + } + if parameter.affinity != _|_ { + affinity: parameter.affinity + } + } + } + traits: [ + { + properties: { + rules: [ + { + host: _ingressHost + paths: [ + { + path: "/" + serviceName: "ollama" + servicePort: 11434 + }, + ] + }, + + ] + tls: [ + { + hosts: [ + _ingressHost, + ] + tlsSecretName: context["ingress.tls_secret_name"] + }, + ] + } + type: "bdos-ingress" + }, + ] + type: "helm" + }, + ] + } + } + + parameter: { + + // +minimum=1 + // +ui:description=副本数 + // +ui:order=1 + replicaCount: *1 | int + + // +ui:description=Ollama 配置 + // +ui:order=2 + ollama: { + // +ui:description= GPU 配置 + // +ui:order=1 + gpu: { + // +ui:description=是否开启GPU + // +ui:order=1 + enabled: *false | bool + + // +ui:description=GPU类型 + // +ui:order=2 + type: "nvidia" | "amd" + + // +minimum=1 + // +ui:description=GPU数量 + // +ui:order=3 + "number": *1 | int + } + // +ui:description=模型列表,支持模型请参考 https://ollama.com/library ,默认为空,指定后会在启动前耗时较长地下载模型。也可以进入容器执行: ollama pull your-model-name + // +ui:order=5 + // +ui:order=4 + models: [...string] + // models: ["qwen:0.5b", "nomic-embed-text:v1.5", ...string] + } + + // +ui:description=持久化配置 + // +ui:order=3 + persistentVolume: { + // +ui:description=是否开启持久化 + // +ui:order=1 + enabled: *true | bool + + // +ui:description=持久化大小 + // +ui:order=2 + size: *"10Gi" | string + } + + // +ui:description=资源规格 + // +ui:order=4 + resources: { + // +ui:description=预留 + // +ui:order=1 + requests: { + // +pattern=^(\d+\.\d{1,3}?|[1-9]\d*m?)$ + // +err:options={"pattern":"请输入正确的CPU格式,如0.25,250m"} + // +ui:description=CPU + cpu: *"0.1" | string + + // +pattern=^[1-9]\d*(Mi|Gi)$ + // +err:options={"pattern":"请输入正确的内存格式,如1024Mi, 1Gi"} + // +ui:description=内存 + memory: *"128Mi" | string + } + // +ui:description=限制 + // +ui:order=2 + limits: { + // +pattern=^(\d+\.\d{1,3}?|[1-9]\d*m?)$ + // +err:options={"pattern":"请输入正确的CPU格式,如0.25,250m"} + // +ui:description=CPU + cpu: *"1" | string + + // +pattern=^[1-9]\d*(Mi|Gi)$ + // +err:options={"pattern":"请输入正确的内存格式,如1024Mi, 1Gi"} + // +ui:description=内存 + memory: *"4Gi" | string + } + } + + // +ui:description=配置kubernetes亲和性,请根据实际情况调整 + // +ui:order=7 + affinity?: {} + + } +} From ccb7f7cffaa74196d5da1146125a6ebf9fe7bfe3 Mon Sep 17 00:00:00 2001 From: hakeedra <1207097871@qq.com> Date: Fri, 19 Jul 2024 10:28:53 +0800 Subject: [PATCH 7/9] Feat: Add Jupyterlab app (#159) Signed-off-by: terry.wang --- catalog/jupyter/README.md | 3 + catalog/jupyter/apps/jupyterlab.app/README.md | 5 + catalog/jupyter/apps/jupyterlab.app/app.yaml | 13 + .../apps/jupyterlab.app/i18n/en/README.md | 5 + .../jupyter/apps/jupyterlab.app/metadata.yaml | 8 + catalog/jupyter/i18n/en/README.md | 3 + catalog/jupyter/metadata.yaml | 8 + .../jupyter/x-definitions/app-jupyterlab.cue | 366 ++++++++++++++++++ 8 files changed, 411 insertions(+) create mode 100644 catalog/jupyter/README.md create mode 100644 catalog/jupyter/apps/jupyterlab.app/README.md create mode 100644 catalog/jupyter/apps/jupyterlab.app/app.yaml create mode 100644 catalog/jupyter/apps/jupyterlab.app/i18n/en/README.md create mode 100644 catalog/jupyter/apps/jupyterlab.app/metadata.yaml create mode 100644 catalog/jupyter/i18n/en/README.md create mode 100644 catalog/jupyter/metadata.yaml create mode 100644 catalog/jupyter/x-definitions/app-jupyterlab.cue diff --git a/catalog/jupyter/README.md b/catalog/jupyter/README.md new file mode 100644 index 0000000..bc78e58 --- /dev/null +++ b/catalog/jupyter/README.md @@ -0,0 +1,3 @@ +### 1. 介绍 + +Jupyter是一个大型的伞形项目,涵盖了许多不同的软件产品和工具,包括流行的Jupyter Notebook和JupyterLab基于网络的笔记本创作和编辑应用程序。Jupyter项目及其子项目都围绕着为计算笔记本的交互式计算提供工具(和标准)。 diff --git a/catalog/jupyter/apps/jupyterlab.app/README.md b/catalog/jupyter/apps/jupyterlab.app/README.md new file mode 100644 index 0000000..840f496 --- /dev/null +++ b/catalog/jupyter/apps/jupyterlab.app/README.md @@ -0,0 +1,5 @@ +### 1. 应用说明 + +JupyterLab是Project Jupyter的下一代用户界面,以灵活强大的用户界面提供经典Jupyter Notebook的所有常见构建块(笔记本、终端、文本编辑器、文件浏览器、丰富输出等)。 + +JupyterLab可以使用使用我们公共API的npm包进行扩展。预构建的扩展可以通过PyPI、conda和其他包管理器进行分发。源扩展可以直接从npm安装(搜索jupyterlab扩展),但需要额外的构建步骤。您还可以在探索GitHub主题JupyterLab扩展时找到JupyterLab扩展。要了解有关扩展的更多信息,请参阅用户文档。 \ No newline at end of file diff --git a/catalog/jupyter/apps/jupyterlab.app/app.yaml b/catalog/jupyter/apps/jupyterlab.app/app.yaml new file mode 100644 index 0000000..f9a2379 --- /dev/null +++ b/catalog/jupyter/apps/jupyterlab.app/app.yaml @@ -0,0 +1,13 @@ +apiVersion: bdc.kdp.io/v1alpha1 +kind: Application +metadata: + labels: + app: jupyterlab + app.core.bdos/type: system + annotations: + app.core.bdos/catalog: jupyterlab + definition.bdc.kdp.io/description: jupyterlab +spec: + type: jupyterlab + properties: + hdfsEnabled: false \ No newline at end of file diff --git a/catalog/jupyter/apps/jupyterlab.app/i18n/en/README.md b/catalog/jupyter/apps/jupyterlab.app/i18n/en/README.md new file mode 100644 index 0000000..0bc062e --- /dev/null +++ b/catalog/jupyter/apps/jupyterlab.app/i18n/en/README.md @@ -0,0 +1,5 @@ +### 1. Application Description + +JupyterLab is the next-generation user interface for Project Jupyter offering all the familiar building blocks of the classic Jupyter Notebook (notebook, terminal, text editor, file browser, rich outputs, etc.) in a flexible and powerful user interface. + +JupyterLab can be extended using npm packages that use our public APIs. The prebuilt extensions can be distributed via PyPI, conda, and other package managers. The source extensions can be installed directly from npm (search for jupyterlab-extension) but require an additional build step. You can also find JupyterLab extensions exploring GitHub topic jupyterlab-extension. To learn more about extensions, see the user documentation. diff --git a/catalog/jupyter/apps/jupyterlab.app/metadata.yaml b/catalog/jupyter/apps/jupyterlab.app/metadata.yaml new file mode 100644 index 0000000..832434e --- /dev/null +++ b/catalog/jupyter/apps/jupyterlab.app/metadata.yaml @@ -0,0 +1,8 @@ +version: +alias: jupyterlab +description: JupyterLab 是一个基于浏览器的交互式开发环境,集成了笔记本(notebooks)、代码和数据可视化工具。 +isGlobal: false +i18n: + en: + description: >- + JupyterLab is a browser-based interactive development environment that integrates notebooks, code, and data visualization tools, widely used for data science, machine learning, and research. diff --git a/catalog/jupyter/i18n/en/README.md b/catalog/jupyter/i18n/en/README.md new file mode 100644 index 0000000..b33a09f --- /dev/null +++ b/catalog/jupyter/i18n/en/README.md @@ -0,0 +1,3 @@ +### 1. Introduction + +Jupyter is a large umbrella project that covers many different software offerings and tools, including the popular Jupyter Notebook and JupyterLab web-based notebook authoring and editing applications. The Jupyter project and its subprojects all center around providing tools (and standards) for interactive computing with computational notebooks. diff --git a/catalog/jupyter/metadata.yaml b/catalog/jupyter/metadata.yaml new file mode 100644 index 0000000..fe5cc57 --- /dev/null +++ b/catalog/jupyter/metadata.yaml @@ -0,0 +1,8 @@ +name: Jupyter +category: 开发工具 +description: Jupyter是一个大型的伞形项目,涵盖了许多不同的软件产品和工具,包括流行的Jupyter Notebook和JupyterLab基于网络的笔记本创作和编辑应用程序。 +i18n: + en: + category: devtools + description: >- + Jupyter is a large umbrella project that covers many different software offerings and tools, including the popular Jupyter Notebook and JupyterLab web-based notebook authoring and editing applications. diff --git a/catalog/jupyter/x-definitions/app-jupyterlab.cue b/catalog/jupyter/x-definitions/app-jupyterlab.cue new file mode 100644 index 0000000..7e6cb43 --- /dev/null +++ b/catalog/jupyter/x-definitions/app-jupyterlab.cue @@ -0,0 +1,366 @@ +jupyterlab: { + annotations: {} + labels: {} + attributes: { + "dynamicParameterMeta": [ + { + "name": "dependencies.hdfsConfigMapName" + "type": "ContextSetting" + "refType": "hdfs" + "refKey": "" + "description": "hdfs config name" + "required": true + }, + { + "name": "dependencies.hiveConfigMapName" + "type": "ContextSetting" + "refType": "hive-metastore" + "refKey": "" + "description": "hive metastore config name" + "required": true + }, + ] + apiResource: { + definition: { + apiVersion: "bdc.kdp.io/v1alpha1" + kind: "Application" + type: "jupyterlab" + } + } + } + description: "jupyterlab" + type: "xdefinition" +} + +template: { + _imageRegistry: *"" | string + if context.docker_registry != _|_ && len(context.docker_registry) > 0 { + _imageRegistry: context.docker_registry + "/" + } + + output: { + "apiVersion": "core.oam.dev/v1beta1" + "kind": "Application" + "metadata": { + "name": context["name"] + "namespace": context["namespace"] + "labels": { + "app": context["name"] + "app.core.bdos/type": "system" + } + "annotations": { + "app.core.bdos/catalog": "jupyterlab" + "reloader.stakater.com/auto": "true" + } + } + "spec": { + "components": [ + { + "name": "jupyterlab" + "type": "k8s-objects" + "properties": { + "objects": [ + { + apiVersion: "apps/v1" + kind: "Deployment" + metadata: { + annotations: { + "app.core.bdos/catalog": "jupyterlab" + } + labels: { + app: context.name + "app.core.bdos/type": "system" + } + name: context.name + if parameter.namespace != _|_ { + namespace: parameter.namespace + } + } + spec: { + if parameter["replicas"] != _|_ { + replicas: parameter.replicas + } + selector: matchLabels: { + app: context.name + "app.oam.dev/component": context.name + } + template: { + metadata: { + labels: { + app: context.name + "app.oam.dev/component": context.name + } + } + spec: { + containers: [{ + name: "jupyterlab" + env: [ + { + "name": "CHOWN_HOME" + "value": "yes" + }, + { + "name": "NOTEBOOK_ARGS" + "value": "--LabApp.token=''" + }, + ] + + image: _imageRegistry + parameter.image + imagePullPolicy: "IfNotPresent" + if parameter.command != _|_ { + command: parameter.command + } + if parameter["args"] != _|_ { + args: parameter.args + } + livenessProbe: { + initialDelaySeconds: 20 + periodSeconds: 20 + failureThreshold: 3 + timeoutSeconds: 10 + tcpSocket: { + port: 8888 + } + } + readinessProbe: { + initialDelaySeconds: 20 + periodSeconds: 20 + failureThreshold: 3 + timeoutSeconds: 10 + tcpSocket: { + port: 8888 + } + } + if parameter.hdfsEnabled { + volumeMounts: [ + { + mountPath: "/usr/local/spark/conf/core-site.xml" + name: "hdfs-conf" + subPath: "core-site.xml" + }, + { + mountPath: "/usr/local/spark/conf/hdfs-site.xml" + name: "hdfs-conf" + subPath: "hdfs-site.xml" + }, + { + mountPath: "/usr/local/spark/conf/hive-site.xml" + name: "hive-conf" + subPath: "hive-site.xml" + }, + ] + } + }] + restartPolicy: "Always" + if parameter["imagePullSecrets"] != _|_ { + imagePullSecrets: [ + context["K8S_IMAGE_PULL_SECRETS_NAME"], + ] + } + serviceAccountName: context.name + if parameter.hdfsEnabled { + volumes: [ + { + name: "hdfs-conf" + configMap: { + name: parameter.dependencies.hdfsConfigMapName + } + }, + { + name: "hive-conf" + configMap: { + name: parameter.dependencies.hiveConfigMapName + } + }, + ] + } + } + } + } + } + ] + } + "traits": [ + { + "type": "bdos-pvc" + "properties": { + "namespace": context.namespace + "claimName": context.name + "-pvc" + "accessModes": [ + "ReadWriteOnce", + ] + "resources": { + "requests": { + "storage": parameter.storage.size + } + } + "storageClassName": context["storage_config.storage_class_mapping.local_disk"] + "volumesToMount": [ + { + "name": "jupyterlab-data" + "mountPath": "/home/root" + }, + ] + } + }, + { + "type": "bdos-service-account" + "properties": { + "name": context["name"] + } + }, + { + "type": "bdos-expose" + "properties": { + serviceName: context.name + "-svc" + "stickySession": true + "ports": [ + { + "containerPort": 8888 + "protocol": "TCP" + }, + { + "containerPort": 4040 + "protocol": "TCP" + }, + ] + } + }, + { + "type": "bdos-ingress" + "properties": { + ingressName: context.name + "-ingress" + "rules": [ + { + "host": "jupyterlab-" + context.namespace + "." + context["ingress.root_domain"], + "paths": [ + { + "path": "/" + "serviceName": context.name + "-svc" + "servicePort": 8888 + }, + ] + }, + ] + "tls": [ + { + "hosts": [ + "jupyterlab-" + context.namespace + "." + context["ingress.root_domain"], + ] + "tlsSecretName": context["ingress.tls_secret_name"] + }, + ] + } + }, + ] + }, + ] + "policies": [ + { + "name": "garbage-collect" + "type": "garbage-collect" + "properties": { + "rules": [ + { + "selector": { + "traitTypes": [ + "bdos-pvc", + ] + } + "strategy": "never" + }, + ] + } + }, + { + name: "take-over" + type: "take-over" + properties: { + rules: [ + { + selector: { + traitTypes: [ + "bdos-pvc", + ] + } + }, + ] + } + }, + ] + } + } + + outputs: {} + + parameter: { + + // +ui:order=1 + // +ui:description=HDFS 配置 + hdfsEnabled: *false | bool + + // +ui:order=2 + // +ui:description=组件依赖 + // +ui:title=组件依赖 + // +ui:hidden={{rootFormData.hdfsEnabled == false}} + dependencies: { + // +ui:description=HDFS 上下文 + // +ui:order=1 + // +err:options={"required":"请先安装 HDFS"} + hdfsConfigMapName: string + // +ui:description=Hive Metastore 上下文 + // +ui:order=3 + // +err:options={"required":"请先安装 Hive Metastore"} + hiveConfigMapName: string + } + // +ui:order=2 + // +minimum=1 + // +ui:description=副本数 + replicas: *1 | int + // +ui:order=3 + // +ui:description=资源规格 + resources: { + // +ui:order=1 + // +ui:description=预留 + requests: { + // +ui:order=1 + // +pattern=^(\d+\.\d{1,3}?|[1-9]\d*m?)$ + // +err:options={"pattern":"请输入正确的CPU格式,如0.25,250m"} + // +ui:description=CPU + cpu: *"0.5" | string + // +ui:order=2 + // +pattern=^[1-9]\d*(Mi|Gi)$ + // +err:options={"pattern":"请输入正确的内存格式,如1024Mi, 1Gi"} + // +ui:description=内存 + memory: *"2Gi" | string + } + // +ui:order=2 + // +ui:description=限制 + limits: { + // +ui:order=1 + // +pattern=^(\d+\.\d{1,3}?|[1-9]\d*m?)$ + // +err:options={"pattern":"请输入正确的CPU格式,如0.25,250m"} + // +ui:description=CPU + cpu: *"2" | string + // +ui:order=2 + // +pattern=^[1-9]\d*(Mi|Gi)$ + // +err:options={"pattern":"请输入正确的内存格式,如1024Mi, 1Gi"} + // +ui:description=内存 + memory: *"2Gi" | string + } + } + + // +ui:order=4 + // +ui:description=存储配置 + storage: { + // +ui:order=1 + // +ui:description=存储大小 + // +pattern=^([1-9]\d*)(Ti|Gi|Mi)$ + size: *"10Gi" | string + } + // +ui:order=100 + // +ui:options={"disabled":true} + // +ui:description=镜像版本 + image: *"jupyter/pyspark-notebook:spark-3.3.0" | string + } +} From f3a26008d7429f3675c4462f3c7edb1f18ca0167 Mon Sep 17 00:00:00 2001 From: xingcan-ltc <166677246+xingcan-ltc@users.noreply.github.com> Date: Fri, 19 Jul 2024 10:29:24 +0800 Subject: [PATCH 8/9] Feat: add elasticsearch app (#171) Signed-off-by: xingcan-ltc --- catalog/elasticsearch/README.md | 19 + .../apps/elasticsearch.app/README.md | 123 +++++ .../apps/elasticsearch.app/app.yaml | 14 + .../apps/elasticsearch.app/i18n/en/README.md | 116 ++++ .../apps/elasticsearch.app/metadata.yaml | 13 + catalog/elasticsearch/i18n/en/README.md | 19 + catalog/elasticsearch/metadata.yaml | 8 + .../x-definitions/app-elasticsearch.cue | 518 ++++++++++++++++++ .../x-definitions/setting-elasticsearch.cue | 37 ++ 9 files changed, 867 insertions(+) create mode 100644 catalog/elasticsearch/README.md create mode 100644 catalog/elasticsearch/apps/elasticsearch.app/README.md create mode 100644 catalog/elasticsearch/apps/elasticsearch.app/app.yaml create mode 100644 catalog/elasticsearch/apps/elasticsearch.app/i18n/en/README.md create mode 100644 catalog/elasticsearch/apps/elasticsearch.app/metadata.yaml create mode 100644 catalog/elasticsearch/i18n/en/README.md create mode 100644 catalog/elasticsearch/metadata.yaml create mode 100644 catalog/elasticsearch/x-definitions/app-elasticsearch.cue create mode 100644 catalog/elasticsearch/x-definitions/setting-elasticsearch.cue diff --git a/catalog/elasticsearch/README.md b/catalog/elasticsearch/README.md new file mode 100644 index 0000000..90d8aae --- /dev/null +++ b/catalog/elasticsearch/README.md @@ -0,0 +1,19 @@ +### 1. 简介 +Elasticsearch 是一款分布式、RESTful 风格的搜索和分析引擎,它集中存储您的数据,让您能够轻松地搜索、索引和分析各种类型和大小的数据。 + +### 2. 产品特性 + +#### 分布式架构 +Elasticsearch 采用分布式架构设计,能够在多台服务器(节点)上运行,并自动管理数据和查询在这些节点间的分布。这种设计确保了系统的高可用性、容错性和可扩展性。 + +#### RESTful API +Elasticsearch 提供了一个 RESTful API,用户可以使用标准的 HTTP 方法(如 GET、POST、PUT、DELETE)与引擎进行交互。这一特性使得 Elasticsearch 能够轻松集成到各种客户端和工具中,不受编程语言的限制。 + +#### 全文搜索 +Elasticsearch 的核心功能之一是其强大的全文搜索能力。它利用倒排索引技术快速定位与搜索查询相匹配的文档,支持复杂的搜索操作、模糊匹配和相关性评分。 + +#### 水平可扩展性 +Elasticsearch 通过增加更多节点来实现水平扩展。这种扩展方式使得 Elasticsearch 能够处理日益增长的数据量和流量,而不会导致性能显著下降。每个节点都能处理部分数据和查询,从而构建了一个均衡且高效的工作系统。 + +#### 实时数据和分析 +Elasticsearch 支持实时索引和搜索功能。一旦文档被索引,它就能立即被搜索到,这为实时数据分析和报告提供了可能。 \ No newline at end of file diff --git a/catalog/elasticsearch/apps/elasticsearch.app/README.md b/catalog/elasticsearch/apps/elasticsearch.app/README.md new file mode 100644 index 0000000..23df952 --- /dev/null +++ b/catalog/elasticsearch/apps/elasticsearch.app/README.md @@ -0,0 +1,123 @@ +### 1. 简介 + +Elasticsearch 是一个基于 Lucene 库的分布式搜索和分析引擎,广泛用于全文搜索、结构化搜索、分析 + +#### 基本概念 + +1. 索引(Index) +定义:索引是具有相似特征的文档的集合。类似于关系数据库中的数据库。 +操作:可以创建、删除和修改索引。 + +2. 类型(Type) +定义:类型是索引中的一个逻辑分类/分区,允许在同一个索引中存储不同类型的文档。但在 Elasticsearch 6.x 及之后的版本中,一个索引只能有一个类型。 +注意:在 Elasticsearch 7.x 及之后的版本中,类型已被移除。 + +3. 文档(Document) +定义:文档是 Elasticsearch 中的基本信息单元,以 JSON 格式表示。类似于关系数据库中的行。 +操作:可以添加、删除、更新和查询文档。 + +4. 字段(Field) +定义:字段是文档中的一个属性,类似于关系数据库中的列。 +类型:字段可以有不同的数据类型,如字符串、整数、布尔值等。 + +5. 映射(Mapping) +定义:映射定义了索引中字段的类型和属性,类似于关系数据库中的表结构。 +操作:可以手动定义映射,也可以让 Elasticsearch 自动生成。 + +6. 查询(Query) +定义:查询是用于从 Elasticsearch 中检索文档的请求。 +类型:包括全文查询、匹配查询、布尔查询等。 + +7. 聚合(Aggregation) +定义:聚合用于对数据进行统计和分析,类似于 SQL 中的 GROUP BY 和聚合函数。 +类型:包括指标聚合(如平均值、总和)、桶聚合(如范围、日期直方图)等。 + +8. 分片(Shard) +定义:分片是索引的一个水平分区,每个分片是一个独立的 Lucene 索引。 +目的:分片允许水平扩展和并行处理,提高性能和可靠性。 + +9. 副本(Replica) +定义:副本是分片的复制,用于提供高可用性和故障恢复。 +操作:可以动态调整副本的数量。 + +10. 节点(Node) +定义:节点是 Elasticsearch 集群中的一个服务器,负责存储数据并参与集群的索引和搜索操作。 +类型:包括主节点、数据节点、协调节点等。 + +11. 集群(Cluster) +定义:集群是多个节点的集合,共同存储整个数据集合并提供联合索引和搜索功能。 +操作:可以动态添加和删除节点。 + +12. 索引模板(Index Template) +定义:索引模板定义了新创建索引的默认设置和映射。 +目的:简化索引创建过程,确保一致性。 + +13. 别名(Alias) +定义:别名是一个指向一个或多个索引的指针,允许在不修改应用代码的情况下切换索引。 +操作:可以创建、删除和更新别名。 + +14. 分析器(Analyzer) +定义:分析器用于将文本转换为词项(tokens),包括字符过滤器、分词器和词项过滤器。 +目的:提高搜索的准确性和相关性。 + + +### 2. 快速开始 + +```bash + +# Set environment variables +export ES_ENDPOINT=http://elasticsearch-kdp-data.kdp-e2e.io +export ES_INDEX=example-rest-curl-$(date +%s) + +# Create an index +curl -X POST "${ES_ENDPOINT}/${ES_INDEX}/_doc?pretty" -H 'Content-Type: application/json' -d' +{ + "@timestamp": "2099-05-06T16:21:15.000Z", + "event": { + "original": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736" + } +} +' +# Get the mapping of an index +curl -X GET "${ES_ENDPOINT}/${ES_INDEX}/_mapping?pretty" + +# Add multiple documents to an index +curl -X PUT "${ES_ENDPOINT}/${ES_INDEX}/_bulk?pretty" -H 'Content-Type: application/json' -d' +{ "create": { } } +{ "@timestamp": "2099-05-07T16:24:32.000Z", "event": { "original": "192.0.2.242 - - [07/May/2020:16:24:32 -0500] \"GET /images/hm_nbg.jpg HTTP/1.0\" 304 0" } } +{ "create": { } } +{ "@timestamp": "2099-05-08T16:25:42.000Z", "event": { "original": "192.0.2.255 - - [08/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638" } } +' + +# Search data in an index +curl -X GET "${ES_ENDPOINT}/${ES_INDEX}/_search?pretty" -H 'Content-Type: application/json' -d' +{ + "query": { + "match": { + "event.original": "favicon.ico" + } + } +} +' + +# Delete an index +curl -X DELETE "${ES_ENDPOINT}/${ES_INDEX}?pretty" + +``` + + + +### 3. FAQ + +1. Elasticsearch 有哪些常用 node role ? + +- 主节点(Master-eligible Node):有资格被选举为主节点的节点。主节点负责管理集群的状态,包括创建和删除索引、跟踪集群中的节点以及分配分片到节点等。 +- 数据节点(Data Node):负责存储数据并执行数据相关的操作,如搜索和聚合。数据节点处理与数据存储和查询相关的负载。 +- 协调节点(Coordinating Node):负责接收客户端请求,将请求分发到相应的数据节点,并收集结果返回给客户端。每个节点默认都是协调节点,但可以通过配置专门指定某些节点为协调节点。 +- 摄取节点(Ingest Node):负责执行预处理管道,对文档进行转换和 enrich 操作。摄取节点在索引文档之前对文档进行预处理。 + + +> https://www.elastic.co/guide/en/elasticsearch/reference/8.14/troubleshooting.html + + + diff --git a/catalog/elasticsearch/apps/elasticsearch.app/app.yaml b/catalog/elasticsearch/apps/elasticsearch.app/app.yaml new file mode 100644 index 0000000..d2dcfab --- /dev/null +++ b/catalog/elasticsearch/apps/elasticsearch.app/app.yaml @@ -0,0 +1,14 @@ +apiVersion: bdc.kdp.io/v1alpha1 +kind: Application +metadata: + annotations: + app.core.bdos/catalog: juicefs + labels: + app: elasticsearch + app.core.bdos/type: system +spec: + name: elasticsearch + type: elasticsearch + properties: + master: + replicaCount: 1 diff --git a/catalog/elasticsearch/apps/elasticsearch.app/i18n/en/README.md b/catalog/elasticsearch/apps/elasticsearch.app/i18n/en/README.md new file mode 100644 index 0000000..cfa6d0a --- /dev/null +++ b/catalog/elasticsearch/apps/elasticsearch.app/i18n/en/README.md @@ -0,0 +1,116 @@ +### 1. Introduction +Elasticsearch is a distributed search and analytics engine based on the Lucene library, widely used for full-text search, structured search, and analytics. + +#### Basic Concepts +1. Index +Definition: An index is a collection of documents that have similar characteristics. It is analogous to a database in a relational database management system. +Operations: Indexes can be created, deleted, and modified. + +2. Type +Definition: A type is a logical category/partition within an index that allows storing different types of documents in the same index. However, in Elasticsearch 6.x and later versions, an index can only have one type. +Note: Types have been removed in Elasticsearch 7.x and later versions. + +3. Document +Definition: A document is the basic unit of information in Elasticsearch, represented in JSON format. It is analogous to a row in a relational database. +Operations: Documents can be added, deleted, updated, and queried. + +4. Field +Definition: A field is an attribute of a document, similar to a column in a relational database. +Types: Fields can have different data types, such as string, integer, boolean, etc. + +5. Mapping +Definition: Mapping defines the types of fields and their properties in an index, similar to the table schema in a relational database. +Operations: Mappings can be defined manually or automatically generated by Elasticsearch. + +6. Query +Definition: A query is a request used to retrieve documents from Elasticsearch. +Types: Includes full-text queries, match queries, boolean queries, etc. + +7. Aggregation +Definition: Aggregations are used to perform statistical and analytical operations on data, similar to GROUP BY and aggregate functions in SQL. +Types: Includes metric aggregations (e.g., average, sum) and bucket aggregations (e.g., range, date histogram). + +8. Shard +Definition: A shard is a horizontal partition of an index, where each shard is an independent Lucene index. +Purpose: Shards allow horizontal scaling and parallel processing, improving performance and reliability. + +9. Replica +Definition: A replica is a copy of a shard, used for high availability and fault tolerance. +Operations: The number of replicas can be adjusted dynamically. + +10. Node +Definition: A node is a server in an Elasticsearch cluster that stores data and participates in the cluster's indexing and search operations. +Types: Includes master nodes, data nodes, coordinating nodes, etc. + +11. Cluster +Definition: A cluster is a collection of nodes that collectively store the entire dataset and provide federated indexing and search capabilities. +Operations: Nodes can be added and removed dynamically. + +12. Index Template +Definition: An index template defines the default settings and mappings for newly created indices. +Purpose: Simplifies the index creation process and ensures consistency. + +13. Alias +Definition: An alias is a pointer to one or more indices, allowing index switching without modifying application code. +Operations: Aliases can be created, deleted, and updated. + +14. Analyzer +Definition: An analyzer is used to convert text into tokens, including character filters, tokenizers, and token filters. +Purpose: Improves the accuracy and relevance of searches. + +### 2. Quick Start + +```bash + +# Set environment variables +export ES_ENDPOINT=http://elasticsearch-kdp-data.kdp-e2e.io +export ES_INDEX=example-rest-curl-$(date +%s) + +# Create an index +curl -X POST "${ES_ENDPOINT}/${ES_INDEX}/_doc?pretty" -H 'Content-Type: application/json' -d' +{ + "@timestamp": "2099-05-06T16:21:15.000Z", + "event": { + "original": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736" + } +} +' +# Get the mapping of an index +curl -X GET "${ES_ENDPOINT}/${ES_INDEX}/_mapping?pretty" + +# Add multiple documents to an index +curl -X PUT "${ES_ENDPOINT}/${ES_INDEX}/_bulk?pretty" -H 'Content-Type: application/json' -d' +{ "create": { } } +{ "@timestamp": "2099-05-07T16:24:32.000Z", "event": { "original": "192.0.2.242 - - [07/May/2020:16:24:32 -0500] \"GET /images/hm_nbg.jpg HTTP/1.0\" 304 0" } } +{ "create": { } } +{ "@timestamp": "2099-05-08T16:25:42.000Z", "event": { "original": "192.0.2.255 - - [08/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638" } } +' + +# Search data in an index +curl -X GET "${ES_ENDPOINT}/${ES_INDEX}/_search?pretty" -H 'Content-Type: application/json' -d' +{ + "query": { + "match": { + "event.original": "favicon.ico" + } + } +} +' + +# Delete an index +curl -X DELETE "${ES_ENDPOINT}/${ES_INDEX}?pretty" + +``` + +### 3. FAQ + +1. Elasticsearch 有哪些常用 node role ? + +- 主节点(Master-eligible Node):有资格被选举为主节点的节点。主节点负责管理集群的状态,包括创建和删除索引、跟踪集群中的节点以及分配分片到节点等。 +- 数据节点(Data Node):负责存储数据并执行数据相关的操作,如搜索和聚合。数据节点处理与数据存储和查询相关的负载。 +- 协调节点(Coordinating Node):负责接收客户端请求,将请求分发到相应的数据节点,并收集结果返回给客户端。每个节点默认都是协调节点,但可以通过配置专门指定某些节点为协调节点。 +- 摄取节点(Ingest Node):负责执行预处理管道,对文档进行转换和 enrich 操作。摄取节点在索引文档之前对文档进行预处理。 + + +> https://www.elastic.co/guide/en/elasticsearch/reference/8.14/troubleshooting.html + diff --git a/catalog/elasticsearch/apps/elasticsearch.app/metadata.yaml b/catalog/elasticsearch/apps/elasticsearch.app/metadata.yaml new file mode 100644 index 0000000..e7415c9 --- /dev/null +++ b/catalog/elasticsearch/apps/elasticsearch.app/metadata.yaml @@ -0,0 +1,13 @@ +version: 8.14.3 +alias: Elasticsearch +description: Elasticsearch 是一款分布式、RESTful 风格的搜索和分析引擎,它集中存储您的数据,让您能够轻松地搜索、索引和分析各种类型和大小的数据。 +isGlobal: false +i18n: + en: + description: >- + Elasticsearch is a distributed, RESTful search and analytics engine that centrally stores your data so you can search, index, and analyze data of all shapes and sizes. +dashboard: + - id: juicefs + name: JuiceFS 监控面板 + i18n: + en: JuiceFS Dashboard \ No newline at end of file diff --git a/catalog/elasticsearch/i18n/en/README.md b/catalog/elasticsearch/i18n/en/README.md new file mode 100644 index 0000000..3c400ae --- /dev/null +++ b/catalog/elasticsearch/i18n/en/README.md @@ -0,0 +1,19 @@ +### 1. Introduction +Elasticsearch is a distributed, RESTful search and analytics engine that centrally stores your data so you can search, index, and analyze data of all shapes and sizes. + +### 2. Product Features + +#### Distributed Architecture +Elasticsearch is designed to be distributed, meaning it can run on multiple nodes (servers) and automatically manages the distribution of data and queries across these nodes. This ensures high availability, fault tolerance, and scalability. + +#### RESTful API +Elasticsearch provides a RESTful API that allows users to interact with the engine using standard HTTP methods (GET, POST, PUT, DELETE). This makes it easy to integrate with various clients and tools, regardless of the programming language.performance metadata service can handle millions of requests per second with microsecond-level latency. + +#### Full-Text Search +One of Elasticsearch's core features is its powerful full-text search capability. It uses inverted indices to quickly locate documents that match search queries, supporting complex search operations, fuzzy matching, and relevance scoring. + +#### Horizontal Scalability +Elasticsearch scales horizontally by adding more nodes to the cluster. This allows it to handle increasing amounts of data and traffic without significant performance degradation. Each node can handle part of the data and queries, providing a balanced and efficient system. + +#### Real-Time Data and Analytics +Elasticsearch allows for real-time indexing and searching. Once a document is indexed, it is immediately searchable, enabling real-time analytics and reporting. \ No newline at end of file diff --git a/catalog/elasticsearch/metadata.yaml b/catalog/elasticsearch/metadata.yaml new file mode 100644 index 0000000..68621f7 --- /dev/null +++ b/catalog/elasticsearch/metadata.yaml @@ -0,0 +1,8 @@ +name: Elasticsearch +category: 系统/存储系统 +description: Elasticsearch 是一款分布式、RESTful 风格的搜索和分析引擎,它集中存储您的数据,让您能够轻松地搜索、索引和分析各种类型和大小的数据。 +i18n: + en: + category: system.storage + description: >- + Elasticsearch is a distributed, RESTful search and analytics engine that centrally stores your data so you can search, index, and analyze data of all shapes and sizes. diff --git a/catalog/elasticsearch/x-definitions/app-elasticsearch.cue b/catalog/elasticsearch/x-definitions/app-elasticsearch.cue new file mode 100644 index 0000000..7abc91b --- /dev/null +++ b/catalog/elasticsearch/x-definitions/app-elasticsearch.cue @@ -0,0 +1,518 @@ +"elasticsearch": { + annotations: {} + labels: {} + attributes: { + dynamicParameterMeta: [ + ] + apiResource: { + definition: { + apiVersion: "bdc.kdp.io/v1alpha1" + kind: "Application" + type: "elasticsearch" + } + } + } + description: "elasticsearch" + type: "xdefinition" +} + +template: { + _ingressHost: context["name"] + "-" + context["namespace"] + "." + context["ingress.root_domain"] + output: { + apiVersion: "core.oam.dev/v1beta1" + kind: "Application" + metadata: { + name: context["name"] + namespace: context["namespace"] + } + spec: { + components: [ + { + name: context["name"] + type: "helm" + properties: { + chart: "elasticsearch" + releaseName: context["name"] + repoType: "oci" + targetNamespace: context["namespace"] + url: context["helm_repo_url"] + // https://artifacthub.io/packages/helm/bitnami/elasticsearch/21.3.1 + version: "21.3.1" + values: { + global: { + kibanaEnabled: parameter.kibana.enabled + imageRegistry: context["docker_registry"] + storageClass: context["storage_config.storage_class_mapping.local_disk"] + } + // security settings + security: { + enabled: false + tls: { + restEncryption: false + } + } + // elasticsearch.yaml + extraConfig: { + xpack: { + security: { + enabled: false + } + } + } + + // master node + master: { + masterOnly: true + replicaCount: parameter.master.replicaCount + persistence: { + enabled: parameter.master.persistence.enabled + size: parameter.master.persistence.size + } + resources: parameter.master.resources + heapSize: parameter.master.heapSize + if parameter.affinity != _|_ { + affinity: parameter.master.affinity + } + } + + coordinating: { + replicaCount: parameter.coordinating.replicaCount + resources: parameter.coordinating.resources + heapSize: parameter.coordinating.heapSize + if parameter.affinity != _|_ { + affinity: parameter.coordinating.affinity + } + } + + data: { + replicaCount: parameter.data.replicaCount + persistence: { + enabled: parameter.data.persistence.enabled + size: parameter.data.persistence.size + } + resources: parameter.data.resources + if parameter.affinity != _|_ { + affinity: parameter.data.affinity + } + } + + ingest: { + enabled: parameter.ingest.enabled + replicaCount: parameter.ingest.replicaCount + resources: parameter.ingest.resources + heapSize: parameter.ingest.heapSize + if parameter.affinity != _|_ { + affinity: parameter.affinity + } + } + if parameter.kibana.enabled { + kibana: { + replicaCount: parameter.kibana.replicaCount + persistence: { + enabled: parameter.kibana.persistence.enabled + size: parameter.kibana.persistence.size + } + resources: parameter.kibana.resources + } + } + + // metrics pod + metrics: { + enabled: true + } + } + } + traits: [ + { + properties: { + rules: [ + { + host: _ingressHost + paths: [ + { + path: "/" + serviceName: "elasticsearch" + servicePort: 9200 + }, + ] + }, + ] + tls: [ + { + hosts: [ + _ingressHost, + ] + tlsSecretName: context["ingress.tls_secret_name"] + }, + ] + } + type: "bdos-ingress" + }, + { + properties: { + endpoints: [ + { + port: 9114 + portName: "http-metrics" + path: "/metrics" + }, + ] + monitortype: "service" + namespace: context["namespace"] + matchLabels: { + "app.kubernetes.io/component": "metrics" + "app.kubernetes.io/name": "elasticsearch" + } + } + type: "bdos-monitor" + }, + { + type: "bdos-grafana-dashboard" + properties: { + labels: { + "grafana_dashboard": "1" + } + dashboard_data: { + "elasticsearch-dashboard.json": "{\"annotations\":{\"list\":[{\"builtIn\":1,\"datasource\":{\"type\":\"datasource\",\"uid\":\"grafana\"},\"enable\":true,\"hide\":true,\"iconColor\":\"rgba(0, 211, 255, 1)\",\"name\":\"Annotations \u0026 Alerts\",\"target\":{\"limit\":100,\"matchAny\":false,\"tags\":[],\"type\":\"dashboard\"},\"type\":\"dashboard\"}]},\"description\":\"ElasticSearch cluster stats.\\r\\n\\r\\nRevision 1 of this dashboard is the same as the Infinity Dashboard Revision 4 (https://grafana.com/dashboards/2322)\\r\\n\\r\\nThis is a cleaned up copy with all control characters removed from the dashboard file. When downloading version 4 of the original Infinity elasticsearch dashboard via curl, the resulting file is corrupted with a missing final curly brace.\\r\\n\",\"editable\":true,\"fiscalYearStartMonth\":0,\"gnetId\":6483,\"graphTooltip\":1,\"id\":1353,\"links\":[],\"liveNow\":false,\"panels\":[{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":0},\"id\":90,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"KPI\",\"type\":\"row\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fieldConfig\":{\"defaults\":{\"color\":{\"mode\":\"thresholds\"},\"mappings\":[{\"options\":{\"1\":{\"text\":\"Red\"},\"3\":{\"text\":\"Yellow\"},\"5\":{\"text\":\"Green\"}},\"type\":\"value\"},{\"options\":{\"match\":\"null\",\"result\":{\"text\":\"N/A\"}},\"type\":\"special\"}],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"#d44a3a\",\"value\":null},{\"color\":\"rgba(237, 129, 40, 0.89)\",\"value\":2},{\"color\":\"#299c46\",\"value\":4}]},\"unit\":\"none\"},\"overrides\":[]},\"gridPos\":{\"h\":3,\"w\":4,\"x\":0,\"y\":1},\"id\":53,\"links\":[],\"maxDataPoints\":100,\"options\":{\"colorMode\":\"value\",\"graphMode\":\"area\",\"justifyMode\":\"auto\",\"orientation\":\"horizontal\",\"reduceOptions\":{\"calcs\":[\"mean\"],\"fields\":\"\",\"values\":false},\"textMode\":\"auto\"},\"pluginVersion\":\"9.0.5\",\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"exemplar\":false,\"expr\":\"elasticsearch_cluster_health_status{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",color=\\\"red\\\"}==1 or (elasticsearch_cluster_health_status{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",color=\\\"green\\\"}==1)+4 or (elasticsearch_cluster_health_status{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",color=\\\"yellow\\\"}==1)+2\",\"format\":\"time_series\",\"instant\":true,\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"\",\"refId\":\"A\"}],\"title\":\"Cluster health\",\"type\":\"stat\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fieldConfig\":{\"defaults\":{\"color\":{\"mode\":\"thresholds\"},\"mappings\":[{\"options\":{\"N/A\":{\"color\":\"#299c46\",\"text\":\"0\"},\"no value\":{\"color\":\"#299c46\",\"text\":\"0\"}},\"type\":\"value\"},{\"options\":{\"match\":\"null\",\"result\":{\"color\":\"#299c46\",\"text\":\"0\"}},\"type\":\"special\"}],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"#299c46\",\"value\":null},{\"color\":\"rgba(237, 129, 40, 0.89)\",\"value\":1},{\"color\":\"#d44a3a\",\"value\":2}]},\"unit\":\"none\"},\"overrides\":[]},\"gridPos\":{\"h\":3,\"w\":3,\"x\":4,\"y\":1},\"id\":81,\"links\":[],\"maxDataPoints\":100,\"options\":{\"colorMode\":\"value\",\"graphMode\":\"area\",\"justifyMode\":\"auto\",\"orientation\":\"horizontal\",\"reduceOptions\":{\"calcs\":[\"mean\"],\"fields\":\"/^__name__$/\",\"values\":false},\"textMode\":\"auto\"},\"pluginVersion\":\"9.0.5\",\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"exemplar\":false,\"expr\":\"count(elasticsearch_breakers_tripped{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\u003e0)\",\"format\":\"time_series\",\"instant\":true,\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"\",\"refId\":\"A\"}],\"title\":\"Tripped for breakers\",\"type\":\"stat\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fieldConfig\":{\"defaults\":{\"color\":{\"mode\":\"thresholds\"},\"mappings\":[{\"options\":{\"match\":\"null\",\"result\":{\"text\":\"N/A\"}},\"type\":\"special\"}],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"rgba(50, 172, 45, 0.97)\",\"value\":null},{\"color\":\"rgba(237, 129, 40, 0.89)\",\"value\":70},{\"color\":\"rgba(245, 54, 54, 0.9)\",\"value\":80}]},\"unit\":\"percent\"},\"overrides\":[]},\"gridPos\":{\"h\":3,\"w\":3,\"x\":7,\"y\":1},\"id\":51,\"links\":[],\"maxDataPoints\":100,\"options\":{\"colorMode\":\"value\",\"graphMode\":\"none\",\"justifyMode\":\"auto\",\"orientation\":\"horizontal\",\"reduceOptions\":{\"calcs\":[\"lastNotNull\"],\"fields\":\"\",\"values\":false},\"textMode\":\"auto\"},\"pluginVersion\":\"9.0.5\",\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"exemplar\":false,\"expr\":\"sum (elasticsearch_process_cpu_percent{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"} ) / count (elasticsearch_process_cpu_percent{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"} )\",\"format\":\"time_series\",\"instant\":true,\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"\",\"metric\":\"\",\"refId\":\"A\",\"step\":60}],\"title\":\"CPU usage Avg.\",\"type\":\"stat\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fieldConfig\":{\"defaults\":{\"color\":{\"mode\":\"thresholds\"},\"mappings\":[{\"options\":{\"match\":\"null\",\"result\":{\"text\":\"N/A\"}},\"type\":\"special\"}],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"rgba(50, 172, 45, 0.97)\",\"value\":null},{\"color\":\"rgba(237, 129, 40, 0.89)\",\"value\":70},{\"color\":\"rgba(245, 54, 54, 0.9)\",\"value\":80}]},\"unit\":\"percent\"},\"overrides\":[]},\"gridPos\":{\"h\":3,\"w\":4,\"x\":10,\"y\":1},\"id\":50,\"links\":[],\"maxDataPoints\":100,\"options\":{\"colorMode\":\"value\",\"graphMode\":\"none\",\"justifyMode\":\"auto\",\"orientation\":\"horizontal\",\"reduceOptions\":{\"calcs\":[\"lastNotNull\"],\"fields\":\"\",\"values\":false},\"textMode\":\"auto\"},\"pluginVersion\":\"9.0.5\",\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"exemplar\":false,\"expr\":\"sum (elasticsearch_jvm_memory_used_bytes{area=\\\"heap\\\",namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}) / sum (elasticsearch_jvm_memory_max_bytes{area=\\\"heap\\\",namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}) * 100\",\"format\":\"time_series\",\"instant\":true,\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"\",\"metric\":\"\",\"refId\":\"A\",\"step\":60}],\"title\":\"JVM memory used Avg.(heap)\",\"type\":\"stat\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"description\":\"Number of nodes in the cluster\",\"fieldConfig\":{\"defaults\":{\"color\":{\"mode\":\"thresholds\"},\"mappings\":[{\"options\":{\"match\":\"null\",\"result\":{\"text\":\"N/A\"}},\"type\":\"special\"}],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"green\",\"value\":null},{\"color\":\"red\",\"value\":80}]},\"unit\":\"none\"},\"overrides\":[]},\"gridPos\":{\"h\":3,\"w\":2,\"x\":14,\"y\":1},\"id\":10,\"links\":[],\"maxDataPoints\":100,\"options\":{\"colorMode\":\"none\",\"graphMode\":\"none\",\"justifyMode\":\"auto\",\"orientation\":\"horizontal\",\"reduceOptions\":{\"calcs\":[\"lastNotNull\"],\"fields\":\"\",\"values\":false},\"textMode\":\"auto\"},\"pluginVersion\":\"9.0.5\",\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_cluster_health_number_of_nodes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\"}\",\"format\":\"time_series\",\"instant\":true,\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"\",\"metric\":\"\",\"refId\":\"A\",\"step\":60}],\"title\":\"Nodes\",\"type\":\"stat\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"description\":\"Number of data nodes in the cluster\",\"fieldConfig\":{\"defaults\":{\"color\":{\"mode\":\"thresholds\"},\"mappings\":[{\"options\":{\"match\":\"null\",\"result\":{\"text\":\"N/A\"}},\"type\":\"special\"}],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"green\",\"value\":null},{\"color\":\"red\",\"value\":80}]},\"unit\":\"none\"},\"overrides\":[]},\"gridPos\":{\"h\":3,\"w\":2,\"x\":16,\"y\":1},\"id\":9,\"links\":[],\"maxDataPoints\":100,\"options\":{\"colorMode\":\"none\",\"graphMode\":\"none\",\"justifyMode\":\"auto\",\"orientation\":\"horizontal\",\"reduceOptions\":{\"calcs\":[\"lastNotNull\"],\"fields\":\"\",\"values\":false},\"textMode\":\"auto\"},\"pluginVersion\":\"9.0.5\",\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_cluster_health_number_of_data_nodes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\"}\",\"format\":\"time_series\",\"instant\":true,\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"\",\"metric\":\"\",\"refId\":\"A\",\"step\":60}],\"title\":\"Data nodes\",\"type\":\"stat\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"description\":\"Cluster level changes which have not yet been executed\",\"fieldConfig\":{\"defaults\":{\"color\":{\"mode\":\"thresholds\"},\"mappings\":[{\"options\":{\"match\":\"null\",\"result\":{\"text\":\"N/A\"}},\"type\":\"special\"}],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"rgba(50, 172, 45, 0.97)\",\"value\":null},{\"color\":\"rgba(237, 129, 40, 0.89)\",\"value\":1},{\"color\":\"rgba(245, 54, 54, 0.9)\",\"value\":5}]},\"unit\":\"none\"},\"overrides\":[]},\"gridPos\":{\"h\":3,\"w\":2,\"x\":18,\"y\":1},\"hideTimeOverride\":true,\"id\":16,\"links\":[],\"maxDataPoints\":100,\"options\":{\"colorMode\":\"value\",\"graphMode\":\"area\",\"justifyMode\":\"auto\",\"orientation\":\"horizontal\",\"reduceOptions\":{\"calcs\":[\"lastNotNull\"],\"fields\":\"\",\"values\":false},\"textMode\":\"auto\"},\"pluginVersion\":\"9.0.5\",\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_cluster_health_number_of_pending_tasks{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\"}\",\"format\":\"time_series\",\"instant\":true,\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"\",\"metric\":\"\",\"refId\":\"A\",\"step\":60}],\"title\":\"Pending tasks\",\"type\":\"stat\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fieldConfig\":{\"defaults\":{\"color\":{\"mode\":\"thresholds\"},\"mappings\":[],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"green\",\"value\":null},{\"color\":\"red\",\"value\":80}]},\"unit\":\"short\"},\"overrides\":[]},\"gridPos\":{\"h\":3,\"w\":4,\"x\":20,\"y\":1},\"id\":89,\"links\":[],\"maxDataPoints\":100,\"options\":{\"colorMode\":\"none\",\"graphMode\":\"none\",\"justifyMode\":\"auto\",\"orientation\":\"horizontal\",\"reduceOptions\":{\"calcs\":[\"lastNotNull\"],\"fields\":\"\",\"values\":false},\"textMode\":\"auto\"},\"pluginVersion\":\"9.0.5\",\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"sum (elasticsearch_process_open_files_count{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"})\",\"format\":\"time_series\",\"instant\":true,\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"\",\"metric\":\"\",\"refId\":\"A\",\"step\":60}],\"title\":\"Open file descriptors per cluster\",\"type\":\"stat\"},{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":4},\"id\":91,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Shards\",\"type\":\"row\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"description\":\"The number of primary shards in your cluster. This is an aggregate total across all indices.\",\"fieldConfig\":{\"defaults\":{\"color\":{\"fixedColor\":\"rgb(31, 120, 193)\",\"mode\":\"fixed\"},\"mappings\":[{\"options\":{\"match\":\"null\",\"result\":{\"text\":\"N/A\"}},\"type\":\"special\"}],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"green\",\"value\":null},{\"color\":\"red\",\"value\":80}]},\"unit\":\"none\"},\"overrides\":[]},\"gridPos\":{\"h\":3,\"w\":4,\"x\":0,\"y\":5},\"id\":11,\"links\":[],\"maxDataPoints\":100,\"options\":{\"colorMode\":\"none\",\"graphMode\":\"area\",\"justifyMode\":\"auto\",\"orientation\":\"horizontal\",\"reduceOptions\":{\"calcs\":[\"lastNotNull\"],\"fields\":\"\",\"values\":false},\"textMode\":\"auto\"},\"pluginVersion\":\"9.0.5\",\"repeat\":\"shard_type\",\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_cluster_health_active_primary_shards{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\"}\",\"format\":\"time_series\",\"instant\":true,\"intervalFactor\":2,\"legendFormat\":\"\",\"refId\":\"A\",\"step\":60}],\"title\":\"Active primary shards\",\"type\":\"stat\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"description\":\"Aggregate total of all shards across all indices, which includes replica shards\",\"fieldConfig\":{\"defaults\":{\"color\":{\"fixedColor\":\"rgb(31, 120, 193)\",\"mode\":\"fixed\"},\"mappings\":[{\"options\":{\"match\":\"null\",\"result\":{\"text\":\"N/A\"}},\"type\":\"special\"}],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"green\",\"value\":null},{\"color\":\"red\",\"value\":80}]},\"unit\":\"none\"},\"overrides\":[]},\"gridPos\":{\"h\":3,\"w\":4,\"x\":4,\"y\":5},\"id\":39,\"links\":[],\"maxDataPoints\":100,\"options\":{\"colorMode\":\"none\",\"graphMode\":\"area\",\"justifyMode\":\"auto\",\"orientation\":\"horizontal\",\"reduceOptions\":{\"calcs\":[\"lastNotNull\"],\"fields\":\"\",\"values\":false},\"textMode\":\"auto\"},\"pluginVersion\":\"9.0.5\",\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_cluster_health_active_shards{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\"}\",\"format\":\"time_series\",\"instant\":true,\"intervalFactor\":2,\"legendFormat\":\"\",\"refId\":\"A\",\"step\":60}],\"title\":\"Active shards\",\"type\":\"stat\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"description\":\"Count of shards that are being freshly created\",\"fieldConfig\":{\"defaults\":{\"color\":{\"fixedColor\":\"rgb(31, 120, 193)\",\"mode\":\"fixed\"},\"mappings\":[{\"options\":{\"match\":\"null\",\"result\":{\"text\":\"N/A\"}},\"type\":\"special\"}],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"green\",\"value\":null},{\"color\":\"red\",\"value\":80}]},\"unit\":\"none\"},\"overrides\":[]},\"gridPos\":{\"h\":3,\"w\":4,\"x\":8,\"y\":5},\"id\":40,\"links\":[],\"maxDataPoints\":100,\"options\":{\"colorMode\":\"none\",\"graphMode\":\"area\",\"justifyMode\":\"auto\",\"orientation\":\"horizontal\",\"reduceOptions\":{\"calcs\":[\"lastNotNull\"],\"fields\":\"\",\"values\":false},\"textMode\":\"auto\"},\"pluginVersion\":\"9.0.5\",\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_cluster_health_initializing_shards{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\"}\",\"format\":\"time_series\",\"instant\":true,\"intervalFactor\":2,\"legendFormat\":\"\",\"refId\":\"A\",\"step\":60}],\"title\":\"Initializing shards\",\"type\":\"stat\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"description\":\"The number of shards that are currently moving from one node to another node.\",\"fieldConfig\":{\"defaults\":{\"color\":{\"fixedColor\":\"rgb(31, 120, 193)\",\"mode\":\"fixed\"},\"mappings\":[{\"options\":{\"match\":\"null\",\"result\":{\"text\":\"N/A\"}},\"type\":\"special\"}],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"green\",\"value\":null},{\"color\":\"red\",\"value\":80}]},\"unit\":\"none\"},\"overrides\":[]},\"gridPos\":{\"h\":3,\"w\":4,\"x\":12,\"y\":5},\"id\":41,\"links\":[],\"maxDataPoints\":100,\"options\":{\"colorMode\":\"none\",\"graphMode\":\"area\",\"justifyMode\":\"auto\",\"orientation\":\"horizontal\",\"reduceOptions\":{\"calcs\":[\"lastNotNull\"],\"fields\":\"\",\"values\":false},\"textMode\":\"auto\"},\"pluginVersion\":\"9.0.5\",\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_cluster_health_relocating_shards{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\"}\",\"format\":\"time_series\",\"instant\":true,\"intervalFactor\":2,\"legendFormat\":\"\",\"refId\":\"A\",\"step\":60}],\"title\":\"Relocating shards\",\"type\":\"stat\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"description\":\"Shards delayed to reduce reallocation overhead\",\"fieldConfig\":{\"defaults\":{\"color\":{\"fixedColor\":\"rgb(31, 120, 193)\",\"mode\":\"fixed\"},\"mappings\":[{\"options\":{\"match\":\"null\",\"result\":{\"text\":\"N/A\"}},\"type\":\"special\"}],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"green\",\"value\":null},{\"color\":\"red\",\"value\":80}]},\"unit\":\"none\"},\"overrides\":[]},\"gridPos\":{\"h\":3,\"w\":4,\"x\":16,\"y\":5},\"id\":42,\"links\":[],\"maxDataPoints\":100,\"options\":{\"colorMode\":\"none\",\"graphMode\":\"area\",\"justifyMode\":\"auto\",\"orientation\":\"horizontal\",\"reduceOptions\":{\"calcs\":[\"lastNotNull\"],\"fields\":\"\",\"values\":false},\"textMode\":\"auto\"},\"pluginVersion\":\"9.0.5\",\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_cluster_health_delayed_unassigned_shards{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\"} \",\"format\":\"time_series\",\"instant\":true,\"intervalFactor\":2,\"legendFormat\":\"\",\"refId\":\"A\",\"step\":60}],\"title\":\"Delayed shards\",\"type\":\"stat\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"description\":\"The number of shards that exist in the cluster state, but cannot be found in the cluster itself\",\"fieldConfig\":{\"defaults\":{\"color\":{\"fixedColor\":\"rgb(31, 120, 193)\",\"mode\":\"fixed\"},\"mappings\":[{\"options\":{\"match\":\"null\",\"result\":{\"text\":\"N/A\"}},\"type\":\"special\"}],\"thresholds\":{\"mode\":\"absolute\",\"steps\":[{\"color\":\"green\",\"value\":null},{\"color\":\"red\",\"value\":80}]},\"unit\":\"none\"},\"overrides\":[]},\"gridPos\":{\"h\":3,\"w\":4,\"x\":20,\"y\":5},\"id\":82,\"links\":[],\"maxDataPoints\":100,\"options\":{\"colorMode\":\"none\",\"graphMode\":\"area\",\"justifyMode\":\"auto\",\"orientation\":\"horizontal\",\"reduceOptions\":{\"calcs\":[\"lastNotNull\"],\"fields\":\"\",\"values\":false},\"textMode\":\"auto\"},\"pluginVersion\":\"9.0.5\",\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_cluster_health_unassigned_shards{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\"} \",\"format\":\"time_series\",\"instant\":true,\"intervalFactor\":2,\"legendFormat\":\"\",\"refId\":\"A\",\"step\":60}],\"title\":\"Unassigned shards\",\"type\":\"stat\"},{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":8},\"id\":92,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"JVM Garbage Collection\",\"type\":\"row\"},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":0,\"y\":9},\"height\":\"400\",\"hiddenSeries\":false,\"id\":7,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"$datasource\"},\"exemplar\":true,\"expr\":\"irate(elasticsearch_jvm_gc_collection_seconds_count{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"instant\":false,\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}} - {{gc}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":10}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"GC count\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"label\":\"GCs\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":12,\"y\":9},\"height\":\"400\",\"hiddenSeries\":false,\"id\":27,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_jvm_gc_collection_seconds_sum{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}} - {{gc}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":10}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"GC time\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"s\",\"label\":\"Time\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":20},\"id\":93,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Translog\",\"type\":\"row\"},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":12,\"x\":0,\"y\":21},\"hiddenSeries\":false,\"id\":77,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"total\":true,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_translog_operations{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Total translog operations\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":12,\"x\":12,\"y\":21},\"hiddenSeries\":false,\"id\":78,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_translog_size_in_bytes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Total translog size in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"collapsed\":true,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":28},\"id\":94,\"panels\":[{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":26},\"id\":79,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_breakers_tripped{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: {{breaker}}\",\"refId\":\"A\"}],\"thresholds\":[],\"title\":\"Tripped for breakers\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":33},\"id\":80,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_breakers_estimated_size_bytes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: {{breaker}}\",\"refId\":\"A\"},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_breakers_limit_size_bytes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: limit for {{breaker}}\",\"refId\":\"B\"}],\"thresholds\":[],\"title\":\"Estimated size in bytes of breaker\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]}],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Breakers\",\"type\":\"row\"},{\"collapsed\":true,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":29},\"id\":95,\"panels\":[{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":0,\"y\":34},\"height\":\"400\",\"id\":30,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_os_load1{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"instant\":false,\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"load1: {{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":20},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_os_load5{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"instant\":false,\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"load5: {{name}}\",\"metric\":\"\",\"refId\":\"B\",\"step\":20},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_os_load15{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"instant\":false,\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"load15: {{name}}\",\"metric\":\"\",\"refId\":\"C\",\"step\":20}],\"thresholds\":[],\"title\":\"Load average\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"cumulative\"},\"transparent\":false,\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"label\":\"CPU usage\",\"logBase\":1,\"max\":100,\"min\":0,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":12,\"y\":34},\"height\":\"400\",\"id\":88,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_process_cpu_percent{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"instant\":false,\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"title\":\"CPU usage\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"cumulative\"},\"transparent\":false,\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"percent\",\"label\":\"CPU usage\",\"logBase\":1,\"max\":100,\"min\":0,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":0,\"y\":41},\"height\":\"400\",\"id\":31,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_jvm_memory_used_bytes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}} used: {{area}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":20},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_jvm_memory_max_bytes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}} max: {{area}}\",\"refId\":\"C\",\"step\":20},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_jvm_memory_pool_peak_used_bytes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}} peak used pool: {{pool}}\",\"refId\":\"D\",\"step\":20}],\"thresholds\":[],\"title\":\"JVM memory usage\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"cumulative\"},\"transparent\":false,\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"label\":\"Memory\",\"logBase\":1,\"min\":0,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":12,\"y\":41},\"height\":\"400\",\"id\":54,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_jvm_memory_committed_bytes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}} committed: {{area}}\",\"refId\":\"B\",\"step\":20},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_jvm_memory_max_bytes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}} max: {{area}}\",\"refId\":\"C\",\"step\":20}],\"thresholds\":[],\"title\":\"JVM memory committed\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"cumulative\"},\"transparent\":false,\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"label\":\"Memory\",\"logBase\":1,\"min\":0,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]}],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"CPU and Memory\",\"type\":\"row\"},{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":30},\"id\":96,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Disk and Network\",\"type\":\"row\"},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":0,\"y\":31},\"height\":\"400\",\"hiddenSeries\":false,\"id\":32,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"current\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"1-(elasticsearch_filesystem_data_available_bytes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}/elasticsearch_filesystem_data_size_bytes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"})\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: {{path}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[{\"colorMode\":\"custom\",\"fill\":true,\"fillColor\":\"rgba(216, 200, 27, 0.27)\",\"op\":\"gt\",\"value\":0.8},{\"colorMode\":\"custom\",\"fill\":true,\"fillColor\":\"rgba(234, 112, 112, 0.22)\",\"op\":\"gt\",\"value\":0.9}],\"timeRegions\":[],\"title\":\"Disk usage\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"percentunit\",\"label\":\"Disk Usage %\",\"logBase\":1,\"max\":1,\"min\":0,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":12,\"y\":31},\"height\":\"400\",\"hiddenSeries\":false,\"id\":47,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[{\"alias\":\"sent\",\"transform\":\"negative-Y\"}],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_transport_tx_size_bytes_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: sent \",\"refId\":\"D\",\"step\":20},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"-irate(elasticsearch_transport_rx_size_bytes_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: received\",\"refId\":\"C\",\"step\":20}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Network usage\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"Bps\",\"label\":\"Bytes/sec\",\"logBase\":1,\"show\":true},{\"format\":\"pps\",\"label\":\"\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":42},\"id\":97,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Documents\",\"type\":\"row\"},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"decimals\":2,\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":0,\"y\":43},\"height\":\"400\",\"hiddenSeries\":false,\"id\":1,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":true,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_docs{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Documents count on node\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":0,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"decimals\":2,\"format\":\"short\",\"label\":\"\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":12,\"y\":43},\"height\":\"400\",\"hiddenSeries\":false,\"id\":24,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":true,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_indexing_index_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Documents indexed rate\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":0,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"label\":\"index calls/s\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"description\":\"Count of deleted documents on this node\",\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":8,\"x\":0,\"y\":54},\"height\":\"400\",\"hiddenSeries\":false,\"id\":25,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":true,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_docs_deleted{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Documents deleted rate\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":0,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"label\":\"Documents/s\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"decimals\":2,\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":8,\"x\":8,\"y\":54},\"height\":\"400\",\"hiddenSeries\":false,\"id\":26,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":true,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"rate(elasticsearch_indices_merges_docs_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Documents merged rate\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":0,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"decimals\":2,\"format\":\"short\",\"label\":\"Documents/s\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":8,\"x\":16,\"y\":54},\"height\":\"400\",\"hiddenSeries\":false,\"id\":52,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":true,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_merges_total_size_bytes_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Documents merged bytes\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":0,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"decbytes\",\"label\":\"Bytes/s\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":65},\"id\":98,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Times\",\"type\":\"row\"},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":0,\"y\":66},\"height\":\"400\",\"hiddenSeries\":false,\"id\":33,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_search_query_time_seconds{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval]) \",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":10}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Query time\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":0,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"s\",\"label\":\"Time\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":12,\"y\":66},\"height\":\"400\",\"hiddenSeries\":false,\"id\":5,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_indexing_index_time_seconds_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":10}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Indexing time\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":0,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"s\",\"label\":\"Time\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":0,\"y\":77},\"height\":\"400\",\"hiddenSeries\":false,\"id\":3,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_merges_total_time_seconds_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":10}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Merging time\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"s\",\"label\":\"Time\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":12,\"y\":77},\"height\":\"400\",\"hiddenSeries\":false,\"id\":87,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_store_throttle_time_seconds_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":10}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Throttle time for index store\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"s\",\"label\":\"Time\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":88},\"id\":99,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Total Operations stats\",\"type\":\"row\"},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":24,\"x\":0,\"y\":89},\"height\":\"400\",\"hiddenSeries\":false,\"id\":48,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":true,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":true,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"rate(elasticsearch_indices_indexing_index_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: indexing\",\"metric\":\"\",\"refId\":\"A\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"rate(elasticsearch_indices_search_query_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: query\",\"refId\":\"B\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"rate(elasticsearch_indices_search_fetch_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: fetch\",\"refId\":\"C\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"rate(elasticsearch_indices_merges_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: merges\",\"refId\":\"D\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"rate(elasticsearch_indices_refresh_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: refresh\",\"refId\":\"E\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"rate(elasticsearch_indices_flush_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: flush\",\"refId\":\"F\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"rate(elasticsearch_indices_get_exists_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: get_exists\",\"refId\":\"G\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"rate(elasticsearch_indices_get_missing_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: get_missing\",\"refId\":\"H\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"rate(elasticsearch_indices_get_tota{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: get\",\"refId\":\"I\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"rate(elasticsearch_indices_indexing_delete_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: indexing_delete\",\"refId\":\"J\",\"step\":10}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Total Operations rate\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"label\":\"Operations/s\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":24,\"x\":0,\"y\":100},\"height\":\"400\",\"hiddenSeries\":false,\"id\":49,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":true,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_indexing_index_time_seconds_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: indexing\",\"metric\":\"\",\"refId\":\"A\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_search_query_time_seconds{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: query\",\"refId\":\"B\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_search_fetch_time_seconds{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: fetch\",\"refId\":\"C\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_merges_total_time_seconds_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: merges\",\"refId\":\"D\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_refresh_time_seconds_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: refresh\",\"refId\":\"E\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_flush_time_seconds{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: flush\",\"refId\":\"F\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_get_exists_time_seconds{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: get_exists\",\"refId\":\"G\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_get_time_seconds{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: get_time\",\"refId\":\"H\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_get_missing_time_seconds{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: get_missing\",\"refId\":\"I\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_indexing_delete_time_seconds_total{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: indexing_delete\",\"refId\":\"J\",\"step\":10},{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_indices_get_time_seconds{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: get\",\"refId\":\"K\",\"step\":10}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Total Operations time\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"cumulative\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"s\",\"label\":\"Time\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":111},\"id\":100,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Thread Pool\",\"type\":\"row\"},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":20,\"w\":6,\"x\":0,\"y\":112},\"hiddenSeries\":false,\"id\":45,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"hideZero\":true,\"max\":true,\"min\":true,\"show\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_thread_pool_rejected_count{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: {{ type }}\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Thread Pool operations rejected\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":true}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":20,\"w\":6,\"x\":6,\"y\":112},\"hiddenSeries\":false,\"id\":46,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"hideZero\":true,\"max\":true,\"min\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_thread_pool_active_count{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: {{ type }}\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Thread Pool operations queued\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":true}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":20,\"w\":6,\"x\":12,\"y\":112},\"height\":\"\",\"hiddenSeries\":false,\"id\":43,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"hideZero\":true,\"max\":true,\"min\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_thread_pool_active_count{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: {{ type }}\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Thread Pool threads active\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":true}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":20,\"w\":6,\"x\":18,\"y\":112},\"hiddenSeries\":false,\"id\":44,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"hideZero\":true,\"max\":true,\"min\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"irate(elasticsearch_thread_pool_completed_count{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}: {{ type }}\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Thread Pool operations completed\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":true}],\"yaxis\":{\"align\":false}},{\"collapsed\":true,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":132},\"id\":101,\"panels\":[{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":0,\"y\":68},\"height\":\"400\",\"id\":4,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":true,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_fielddata_memory_size_bytes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"title\":\"Field data memory size\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":0,\"value_type\":\"cumulative\"},\"transparent\":false,\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"label\":\"Memory\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":12,\"x\":12,\"y\":68},\"height\":\"400\",\"id\":34,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":true,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"rate(elasticsearch_indices_fielddata_evictions{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"title\":\"Field data evictions\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":0,\"value_type\":\"cumulative\"},\"transparent\":false,\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"label\":\"Evictions/s\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":8,\"x\":0,\"y\":75},\"height\":\"400\",\"id\":35,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":true,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_query_cache_memory_size_bytes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"title\":\"Query cache size\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":0,\"value_type\":\"cumulative\"},\"transparent\":false,\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"label\":\"Size\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":8,\"x\":8,\"y\":75},\"height\":\"400\",\"id\":36,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":true,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"rate(elasticsearch_indices_query_cache_evictions{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"title\":\"Query cache evictions\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":0,\"value_type\":\"cumulative\"},\"transparent\":false,\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"label\":\"Evictions/s\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"editable\":true,\"error\":false,\"fill\":1,\"grid\":{},\"gridPos\":{\"h\":11,\"w\":8,\"x\":16,\"y\":75},\"height\":\"400\",\"id\":84,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":true,\"hideEmpty\":false,\"hideZero\":false,\"max\":true,\"min\":true,\"rightSide\":false,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"connected\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":true,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"rate(elasticsearch_indices_filter_cache_evictions{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}[$interval])\",\"format\":\"time_series\",\"interval\":\"\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"metric\":\"\",\"refId\":\"A\",\"step\":20}],\"thresholds\":[],\"title\":\"Evictions from filter cache\",\"tooltip\":{\"msResolution\":false,\"shared\":true,\"sort\":0,\"value_type\":\"cumulative\"},\"transparent\":false,\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"label\":\"Evictions/s\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]}],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Caches\",\"type\":\"row\"},{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":133},\"id\":102,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Segments\",\"type\":\"row\"},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":134},\"hiddenSeries\":false,\"id\":85,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":true,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segments_count{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Count of index segments\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":141},\"hiddenSeries\":false,\"id\":86,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":true,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segments_memory_bytes{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\",name=~\\\"$name\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{name}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Current memory size of segments in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":148},\"id\":103,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Indices: Count of documents and Total size\",\"type\":\"row\"},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":149},\"hiddenSeries\":false,\"id\":75,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_docs_primary{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Count of documents with only primary shards\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":156},\"hiddenSeries\":false,\"id\":83,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_store_size_bytes_primary{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Total size of stored index data in bytes with only primary shards on all nodes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":163},\"hiddenSeries\":false,\"id\":76,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_store_size_bytes_total{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Total size of stored index data in bytes with all shards on all nodes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":170},\"id\":104,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Indices: Index writer\",\"type\":\"row\"},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":171},\"hiddenSeries\":false,\"id\":61,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"hideZero\":true,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_index_writer_memory_bytes_primary{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Index writer with only primary shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":178},\"hiddenSeries\":false,\"id\":62,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"hideZero\":true,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_index_writer_memory_bytes_total{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Index writer with all shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"collapsed\":true,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":185},\"id\":105,\"panels\":[{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":107},\"id\":55,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_count_primary{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"title\":\"Segments with only primary shards on all nodes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":true}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":114},\"id\":56,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_count_total{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"title\":\"Segments with all shards on all nodes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"short\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":true}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":121},\"id\":65,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_memory_bytes_primary{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"title\":\"Size of segments with only primary shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":128},\"id\":66,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_memory_bytes_total{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"title\":\"Size of segments with all shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":true}]}],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Indices: Segments\",\"type\":\"row\"},{\"collapsed\":true,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":186},\"id\":106,\"panels\":[{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":129},\"id\":57,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_doc_values_memory_bytes_primary{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"title\":\"Doc values with only primary shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":136},\"id\":58,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_doc_values_memory_bytes_total{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"title\":\"Doc values with all shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]}],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Indices: Doc values\",\"type\":\"row\"},{\"collapsed\":true,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":187},\"id\":107,\"panels\":[{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":137},\"id\":59,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_fields_memory_bytes_primary{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"title\":\"Size of fields with only primary shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":144},\"id\":60,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_fields_memory_bytes_total{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"title\":\"Size of fields with all shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]}],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Indices: Fields\",\"type\":\"row\"},{\"collapsed\":true,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":188},\"id\":108,\"panels\":[{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":145},\"id\":63,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_fixed_bit_set_memory_bytes_primary{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"title\":\"Size of fixed bit with only primary shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":152},\"id\":64,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_fixed_bit_set_memory_bytes_total{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"title\":\"Size of fixed bit with all shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]}],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Indices: Fixed bit\",\"type\":\"row\"},{\"collapsed\":true,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":189},\"id\":109,\"panels\":[{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":153},\"id\":67,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_norms_memory_bytes_primary{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"title\":\"Size of norms with only primary shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":160},\"id\":68,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"percentage\":false,\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_norms_memory_bytes_total{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"title\":\"Size of norms with all shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}]}],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Indices: Norms\",\"type\":\"row\"},{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":190},\"id\":110,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Indices: Points\",\"type\":\"row\"},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":191},\"hiddenSeries\":false,\"id\":69,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_points_memory_bytes_primary{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Size of points with only primary shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":198},\"hiddenSeries\":false,\"id\":70,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_points_memory_bytes_total{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Size of points with all shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":205},\"id\":111,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Indices: Terms\",\"type\":\"row\"},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":206},\"hiddenSeries\":false,\"id\":71,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_terms_memory_primary{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Size of terms with only primary shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"$$hashKey\":\"object:397\",\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"$$hashKey\":\"object:398\",\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":213},\"hiddenSeries\":false,\"id\":72,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_terms_memory_total{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Number of terms with all shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"$$hashKey\":\"object:231\",\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"$$hashKey\":\"object:232\",\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"collapsed\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"gridPos\":{\"h\":1,\"w\":24,\"x\":0,\"y\":220},\"id\":112,\"panels\":[],\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"prometheus\"},\"refId\":\"A\"}],\"title\":\"Indices: Version map\",\"type\":\"row\"},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":221},\"hiddenSeries\":false,\"id\":73,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"hideZero\":true,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_version_map_memory_bytes_primary{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Size of version map with only primary shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"$$hashKey\":\"object:314\",\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"$$hashKey\":\"object:315\",\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}},{\"aliasColors\":{},\"bars\":false,\"dashLength\":10,\"dashes\":false,\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"fill\":1,\"fillGradient\":0,\"gridPos\":{\"h\":7,\"w\":24,\"x\":0,\"y\":228},\"hiddenSeries\":false,\"id\":74,\"legend\":{\"alignAsTable\":true,\"avg\":true,\"current\":false,\"hideZero\":true,\"max\":true,\"min\":true,\"rightSide\":true,\"show\":true,\"sort\":\"avg\",\"sortDesc\":true,\"total\":false,\"values\":true},\"lines\":true,\"linewidth\":1,\"links\":[],\"nullPointMode\":\"null\",\"options\":{\"alertThreshold\":true},\"percentage\":false,\"pluginVersion\":\"9.0.5\",\"pointradius\":5,\"points\":false,\"renderer\":\"flot\",\"seriesOverrides\":[],\"spaceLength\":10,\"stack\":false,\"steppedLine\":false,\"targets\":[{\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"expr\":\"elasticsearch_indices_segment_version_map_memory_bytes_total{instance=~\\\"$instance\\\"}\",\"format\":\"time_series\",\"intervalFactor\":2,\"legendFormat\":\"{{index}}\",\"refId\":\"A\"}],\"thresholds\":[],\"timeRegions\":[],\"title\":\"Size of version map with all shards on all nodes in bytes\",\"tooltip\":{\"shared\":true,\"sort\":2,\"value_type\":\"individual\"},\"type\":\"graph\",\"xaxis\":{\"mode\":\"time\",\"show\":true,\"values\":[]},\"yaxes\":[{\"format\":\"bytes\",\"logBase\":1,\"show\":true},{\"format\":\"short\",\"logBase\":1,\"show\":false}],\"yaxis\":{\"align\":false}}],\"refresh\":\"1m\",\"schemaVersion\":36,\"style\":\"dark\",\"tags\":[\"elasticsearch\",\"App\",\"es\"],\"templating\":{\"list\":[{\"current\":{\"selected\":false,\"text\":\"default\",\"value\":\"default\"},\"hide\":0,\"includeAll\":false,\"multi\":false,\"name\":\"datasource\",\"options\":[],\"query\":\"prometheus\",\"queryValue\":\"\",\"refresh\":1,\"regex\":\"\",\"skipUrlSync\":false,\"type\":\"datasource\"},{\"current\":{\"selected\":true,\"text\":\"admin\",\"value\":\"admin\"},\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"definition\":\"label_values(elasticsearch_indices_docs,namespace)\",\"hide\":0,\"includeAll\":false,\"label\":\"namespace\",\"multi\":false,\"name\":\"namespace\",\"options\":[],\"query\":{\"query\":\"label_values(elasticsearch_indices_docs,namespace)\",\"refId\":\"StandardVariableQuery\"},\"refresh\":1,\"regex\":\"\",\"skipUrlSync\":false,\"sort\":1,\"type\":\"query\"},{\"current\":{\"selected\":false,\"text\":\"elastic\",\"value\":\"elastic\"},\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"definition\":\"label_values(elasticsearch_indices_docs{namespace=\\\"$namespace\\\"},cluster)\",\"hide\":0,\"includeAll\":false,\"label\":\"Cluster\",\"multi\":false,\"name\":\"cluster\",\"options\":[],\"query\":{\"query\":\"label_values(elasticsearch_indices_docs{namespace=\\\"$namespace\\\"},cluster)\",\"refId\":\"StandardVariableQuery\"},\"refresh\":1,\"regex\":\"\",\"skipUrlSync\":false,\"sort\":1,\"type\":\"query\",\"useTags\":false},{\"current\":{\"selected\":true,\"text\":[\"All\"],\"value\":[\"$__all\"]},\"datasource\":{\"type\":\"prometheus\",\"uid\":\"${datasource}\"},\"definition\":\"label_values(elasticsearch_indices_docs{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\", name!=\\\"\\\"},name)\",\"description\":\"es pod name\",\"hide\":0,\"includeAll\":true,\"label\":\"Pode name\",\"multi\":true,\"name\":\"name\",\"options\":[],\"query\":{\"query\":\"label_values(elasticsearch_indices_docs{namespace=\\\"$namespace\\\",cluster=\\\"$cluster\\\", name!=\\\"\\\"},name)\",\"refId\":\"StandardVariableQuery\"},\"refresh\":1,\"regex\":\"\",\"skipUrlSync\":false,\"sort\":1,\"type\":\"query\",\"useTags\":false},{\"auto\":false,\"auto_count\":30,\"auto_min\":\"10s\",\"current\":{\"selected\":false,\"text\":\"1m\",\"value\":\"1m\"},\"description\":\"irate interval\",\"hide\":0,\"name\":\"interval\",\"options\":[{\"selected\":true,\"text\":\"1m\",\"value\":\"1m\"},{\"selected\":false,\"text\":\"10m\",\"value\":\"10m\"},{\"selected\":false,\"text\":\"30m\",\"value\":\"30m\"},{\"selected\":false,\"text\":\"1h\",\"value\":\"1h\"},{\"selected\":false,\"text\":\"6h\",\"value\":\"6h\"},{\"selected\":false,\"text\":\"12h\",\"value\":\"12h\"},{\"selected\":false,\"text\":\"1d\",\"value\":\"1d\"},{\"selected\":false,\"text\":\"7d\",\"value\":\"7d\"},{\"selected\":false,\"text\":\"14d\",\"value\":\"14d\"},{\"selected\":false,\"text\":\"30d\",\"value\":\"30d\"}],\"query\":\"1m,10m,30m,1h,6h,12h,1d,7d,14d,30d\",\"queryValue\":\"\",\"refresh\":2,\"skipUrlSync\":false,\"type\":\"interval\"}]},\"time\":{\"from\":\"now-1h\",\"to\":\"now\"},\"timepicker\":{\"refresh_intervals\":[\"5s\",\"10s\",\"30s\",\"1m\",\"5m\",\"15m\",\"30m\",\"1h\",\"2h\",\"1d\"],\"time_options\":[\"5m\",\"15m\",\"1h\",\"6h\",\"12h\",\"24h\",\"2d\",\"7d\",\"30d\"]},\"timezone\":\"browser\",\"title\":\"elasticsearch\",\"uid\":\"elasticsearch\",\"version\":1,\"weekStart\":\"\"}" + } + } + }, + ] + }, + { + name: context["name"] + "-context" + type: "k8s-objects" + properties: { + objects: [{ + apiVersion: "bdc.kdp.io/v1alpha1" + kind: "ContextSetting" + metadata: { + annotations: { + "setting.ctx.bdc.kdp.io/origin": "system" + "setting.ctx.bdc.kdp.io/type": "elasticsearch" + } + name: context["namespace"] + "-" + context["name"] + "-context-setting" + namespace: context["namespace"] + } + spec: { + name: context["name"] + "-context-setting" + _port: "9200" + _hostname: context["name"] + "." + context["namespace"] + ".svc.cluster.local" + properties: { + hostname: _hostname + port: _port + host: _hostname + ":" + _port + } + type: "elasticsearch" + } + }] + } + }, + ] + policies: [] + } + } + + parameter: { + // +ui:title=master 节点配置 + // +ui:order=1 + master: { + // +minimum=1 + // +ui:description=master 节点数量, 建议生产环境设置为 3 + // +ui:order=1 + replicaCount: *1 | int + + // +ui:title=存储配置 + // +ui:order=2 + persistence: { + // +ui:description=是否启用持久化存储, 建议生产环境设置为 true + // +ui:order=1 + enabled: *true | bool + + // pattern=^[1-9]\d*(Gi|Mi|Ti)$ + // err:options={"pattern":"请输入正确格式,如1024Mi, 1Gi, 1Ti"} + // +ui:description=各节点存储大小,请根据实际情况调整 + // +ui:order=2 + // +ui:hidden={{rootFormData.master.persistence.enabled == false}} + size: *"1Gi" | string + } + + // +ui:description=资源规格 + // +ui:order=3 + resources: { + // +ui:description=预留 + // +ui:order=1 + requests: { + // +pattern=^(\d+\.\d{1,3}?|[1-9]\d*m?)$ + // +err:options={"pattern":"请输入正确的CPU格式,如0.25,250m"} + // +ui:description=CPU + cpu: *"25m" | string + + // +pattern=^[1-9]\d*(Mi|Gi)$ + // +err:options={"pattern":"请输入正确的内存格式,如1024Mi, 1Gi"} + // +ui:description=内存 + memory: *"1Gi" | string + } + + // +ui:description=限制 + // +ui:order=2 + limits: { + // +pattern=^(\d+\.\d{1,3}?|[1-9]\d*m?)$ + // +err:options={"pattern":"请输入正确的CPU格式,如0.25,250m"} + // +ui:description=CPU + cpu: *"2" | string + + // +pattern=^[1-9]\d*(Mi|Gi)$ + // +err:options={"pattern":"请输入正确的内存格式,如1024Mi, 1Gi"} + // +ui:description=内存 + memory: *"1Gi" | string + } + } + + // pattern=^[1-9]\d*[mg]$ + // err:options={"pattern":"请输入正确的格式,如512m, 1g"} + // +ui:description=各节点headSize,请根据实际情况调整. 注意单位是“m”, 参考jvm的内存配置Xmx + // +ui:order=4 + heapSize: *"512m" | string + + // +ui:description=配置kubernetes亲和性,请根据实际情况调整 + // +ui:order=5 + affinity?: {} + } + + // +ui:title=coordinating 节点配置 + // +ui:order=2 + coordinating: { + // +minimum=0 + // +ui:description=master 节点数量, 建议生产环境配置2个起 + // +ui:order=1 + replicaCount: *0 | int + + // +ui:description=资源规格 + // +ui:order=2 + resources: { + // +ui:description=预留 + // +ui:order=1 + requests: { + // +pattern=^(\d+\.\d{1,3}?|[1-9]\d*m?)$ + // +err:options={"pattern":"请输入正确的CPU格式,如0.25,250m"} + // +ui:description=CPU + cpu: *"25m" | string + + // +pattern=^[1-9]\d*(Mi|Gi)$ + // +err:options={"pattern":"请输入正确的内存格式,如1024Mi, 1Gi"} + // +ui:description=内存 + memory: *"1Gi" | string + } + + // +ui:description=限制 + // +ui:order=2 + limits: { + // +pattern=^(\d+\.\d{1,3}?|[1-9]\d*m?)$ + // +err:options={"pattern":"请输入正确的CPU格式,如0.25,250m"} + // +ui:description=CPU + cpu: *"2" | string + + // +pattern=^[1-9]\d*(Mi|Gi)$ + // +err:options={"pattern":"请输入正确的内存格式,如1024Mi, 1Gi"} + // +ui:description=内存 + memory: *"1Gi" | string + } + } + + // pattern=^[1-9]\d*[mg]$ + // err:options={"pattern":"请输入正确的格式,如512m, 1g"} + // +ui:description=各节点headSize,请根据实际情况调整. 注意单位是“m”, 参考jvm的内存配置Xmx + // +ui:order=3 + heapSize: *"512m" | string + + // +ui:description=配置kubernetes亲和性,请根据实际情况调整 + // +ui:order=4 + affinity?: {} + } + + // +ui:title=data 节点配置 + // +ui:order=3 + data: { + // +minimum=1 + // +ui:description=master 节点数量, 建议生产环境配置2个起 + // +ui:order=1 + replicaCount: *1 | int + + // +ui:title=存储配置 + // +ui:order=2 + persistence: { + // +ui:description=是否启用持久化存储, 建议生产环境设置为 true + // +ui:order=1 + enabled: *true | bool + + // pattern=^[1-9]\d*(Gi|Mi|Ti)$ + // err:options={"pattern":"请输入正确格式,如1024Mi, 1Gi, 1Ti"} + // +ui:description=各节点存储大小,请根据实际情况调整 + // +ui:order=2 + // +ui:hidden={{rootFormData.data.persistence.enabled == false}} + size: *"2Gi" | string + } + + // +ui:description=资源规格 + // +ui:order=3 + resources: { + // +ui:description=预留 + // +ui:order=1 + requests: { + // +pattern=^(\d+\.\d{1,3}?|[1-9]\d*m?)$ + // +err:options={"pattern":"请输入正确的CPU格式,如0.25,250m"} + // +ui:description=CPU + cpu: *"25m" | string + + // +pattern=^[1-9]\d*(Mi|Gi)$ + // +err:options={"pattern":"请输入正确的内存格式,如1024Mi, 1Gi"} + // +ui:description=内存 + memory: *"2Gi" | string + } + + // +ui:description=限制 + // +ui:order=2 + limits: { + // +pattern=^(\d+\.\d{1,3}?|[1-9]\d*m?)$ + // +err:options={"pattern":"请输入正确的CPU格式,如0.25,250m"} + // +ui:description=CPU + cpu: *"2" | string + + // +pattern=^[1-9]\d*(Mi|Gi)$ + // +err:options={"pattern":"请输入正确的内存格式,如1024Mi, 1Gi"} + // +ui:description=内存 + memory: *"2Gi" | string + } + } + + // pattern=^[1-9]\d*[mg]$ + // err:options={"pattern":"请输入正确的格式,如512m, 1g"} + // +ui:description=各节点headSize,请根据实际情况调整. 注意单位是“m”, 参考jvm的内存配置Xmx + // +ui:order=4 + heapSize: *"512m" | string + + // +ui:description=配置kubernetes亲和性,请根据实际情况调整 + // +ui:order=5 + affinity?: {} + } + + // +ui:title=ingest 节点配置 + // +ui:order=4 + ingest: { + // +ui:description=是否启用ingest节点 + // +ui:order=1 + enabled: *false | bool + + // +minimum=0 + // +ui:description=master 节点数量, 建议生产环境设置为 3 + // +ui:order=2 + replicaCount: *0 | int + + // +ui:description=资源规格 + // +ui:order=3 + resources: { + // +ui:description=预留 + // +ui:order=1 + requests: { + // +pattern=^(\d+\.\d{1,3}?|[1-9]\d*m?)$ + // +err:options={"pattern":"请输入正确的CPU格式,如0.25,250m"} + // +ui:description=CPU + cpu: *"25m" | string + + // +pattern=^[1-9]\d*(Mi|Gi)$ + // +err:options={"pattern":"请输入正确的内存格式,如1024Mi, 1Gi"} + // +ui:description=内存 + memory: *"1Gi" | string + } + + // +ui:description=限制 + // +ui:order=2 + limits: { + // +pattern=^(\d+\.\d{1,3}?|[1-9]\d*m?)$ + // +err:options={"pattern":"请输入正确的CPU格式,如0.25,250m"} + // +ui:description=CPU + cpu: *"2" | string + + // +pattern=^[1-9]\d*(Mi|Gi)$ + // +err:options={"pattern":"请输入正确的内存格式,如1024Mi, 1Gi"} + // +ui:description=内存 + memory: *"1Gi" | string + } + } + + // pattern=^[1-9]\d*[mg]$ + // err:options={"pattern":"请输入正确的格式,如512m, 1g"} + // +ui:description=各节点headSize,请根据实际情况调整. 注意单位是“m”, 参考jvm的内存配置Xmx + // +ui:order=4 + heapSize: *"128m" | string + } + + // +ui:title=kibana 配置 + kibana: { + // +ui:description=是否安装kibana组件 + // +ui:order=1 + enabled: *false | bool + + // +minimum=0 + // +ui:description=master 节点数量, 建议生产环境设置为 3 + // +ui:hidden={{rootFormData.kibana.enabled == false}} + // +ui:order=2 + replicaCount: *1 | int + + // +ui:title=存储配置 + // +ui:hidden={{rootFormData.kibana.enabled == false}} + // +ui:order=3 + persistence: { + // +ui:description=是否启用持久化存储, 建议生产环境设置为 true + // +ui:order=1 + enabled: *true | bool + // pattern=^[1-9]\d*(Gi|Mi|Ti)$ + // err:options={"pattern":"请输入正确格式,如1024Mi, 1Gi, 1Ti"} + // +ui:description=各节点存储大小,请根据实际情况调整 + // +ui:order=2 + // +ui:hidden={{rootFormData.data.persistence.enabled == false}} + size: *"1Gi" | string + } + + // +ui:description=资源规格 + // +ui:hidden={{rootFormData.kibana.enabled == false}} + // +ui:order=4 + resources: { + // +ui:description=预留 + // +ui:order=1 + requests: { + // +pattern=^(\d+\.\d{1,3}?|[1-9]\d*m?)$ + // +err:options={"pattern":"请输入正确的CPU格式,如0.25,250m"} + // +ui:description=CPU + cpu: *"25m" | string + + // +pattern=^[1-9]\d*(Mi|Gi)$ + // +err:options={"pattern":"请输入正确的内存格式,如1024Mi, 1Gi"} + // +ui:description=内存 + memory: *"1Gi" | string + } + + // +ui:description=限制 + // +ui:order=2 + limits: { + // +pattern=^(\d+\.\d{1,3}?|[1-9]\d*m?)$ + // +err:options={"pattern":"请输入正确的CPU格式,如0.25,250m"} + // +ui:description=CPU + cpu: *"2" | string + + // +pattern=^[1-9]\d*(Mi|Gi)$ + // +err:options={"pattern":"请输入正确的内存格式,如1024Mi, 1Gi"} + // +ui:description=内存 + memory: *"1Gi" | string + } + } + + // +ui:description=配置kubernetes亲和性,请根据实际情况调整 + // +ui:hidden={{rootFormData.kibana.enabled == false}} + // +ui:order=5 + affinity?: {} + } + + } +} diff --git a/catalog/elasticsearch/x-definitions/setting-elasticsearch.cue b/catalog/elasticsearch/x-definitions/setting-elasticsearch.cue new file mode 100644 index 0000000..20f750b --- /dev/null +++ b/catalog/elasticsearch/x-definitions/setting-elasticsearch.cue @@ -0,0 +1,37 @@ +"ctx-setting-juicefs": { + description: "" + type: "xdefinition" + attributes: { + apiResource: { + definition: { + apiVersion: "bdc.kdp.io/v1alpha1" + kind: "ContextSetting" + type: "elasticsearch" + } + } + } + labels: {} + annotations: {} +} + +template: { + output: { + apiVersion: "v1" + kind: "ConfigMap" + metadata: { + name: context.name + namespace: context.namespace + annotations: context.bdcAnnotations + } + data: { + "host": parameter.host + "hostname": parameter.hostname + "port": parameter.port + } + } + parameter: { + host: string + hostname: string + port: string + } +} From 23a833ab7fbd9eb8c0b0340a1713aa78fa4f0923 Mon Sep 17 00:00:00 2001 From: Zhao Yuanjie Date: Fri, 19 Jul 2024 10:31:00 +0800 Subject: [PATCH 9/9] Docs: Add Vanna Chat2SQL tutorial (#170) Signed-off-by: Zhao Yuanjie --- docs/en/user-tutorials/images/llm-rag-01.jpg | Bin 0 -> 130590 bytes docs/en/user-tutorials/llm-rag-guide.md | 164 +++++++++++++++++++ docs/en/user-tutorials/tutorials.md | 1 + docs/zh/user-tutorials/images/llm-rag-01.jpg | Bin 0 -> 130590 bytes docs/zh/user-tutorials/llm-rag-guide.md | 164 +++++++++++++++++++ docs/zh/user-tutorials/tutorials.md | 1 + 6 files changed, 330 insertions(+) create mode 100644 docs/en/user-tutorials/images/llm-rag-01.jpg create mode 100644 docs/en/user-tutorials/llm-rag-guide.md create mode 100644 docs/zh/user-tutorials/images/llm-rag-01.jpg create mode 100644 docs/zh/user-tutorials/llm-rag-guide.md diff --git a/docs/en/user-tutorials/images/llm-rag-01.jpg b/docs/en/user-tutorials/images/llm-rag-01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a921b893f8153e06c3c17ca45eb5fbc6d2a0d002 GIT binary patch literal 130590 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

;l+Akpv85-()cKQE?Wu?h zT`no*5rS$tS$WJjJ*Hc)g@$_HA^VYn=vS-^@cl*~pj}WG7>lqK7!XY{X6=@M>^rm} zY{lw7{jiK5@DGoq+?z#o_k`$g-2dW@#L`Cb?)g@7Zv$*jdkq564?tn%+i$_Nq~xA< zEdS_J9tcPBd59WBbNAAG$$$3$M*M&0b^EEoc}_qZnYSN3v8(Fxw|6wxZ_nI_CM{#o z%9|EE{i3OrzBmIv4q0m53|%y_PFc+J(kXCuHr1PAxpDry@rI<>(C6X(_>SUfE%H{W zy{VXUx^zOxX& z)4Hf!dJ!pv+J+uO1AUtBzTVH5|H)xFCti7AMAp^emkpJq+vC5FcmFQ~tZoxK{Mg!Q z%C55K$Mi&3`fGi%2Y#8w(d4iYz7MpieB?vhTdhId%wqqY{{a@Ox%a~9`?qmGitG%> zzTJxeg|Qvd(SDe3tRVEgg?1LY0Knu+;d?q#0uKE8ScdVwgfW!6M}}F2sy0ZyjhUH7 zf93f1d|hjh8aSV=*sl-!bj~zEh6z$H$M^psmg&c$8ULA9nxE%>UZwgdp1aSx zpvEgZ%Teuifz`)7FZYIp8{Zd|wY~O4^m>+oWEkj1bE7K!xvL5A*-H0 zC+0sfF@G%93EU#+TO?(V7cFcM3i#*A)HR51Ju zDbnL$W^w|7rM%1>?`VShIC1uVY2j^C?j%(7M&4M}jSUCF7cX;lF&`EeN897KfciSI zVskw3p$e<&>4{{4);`*+HHh;<323>UW#C}5p17pxrH_n{RSNBJhnx72fdd^^lyK}; zQ!gE(4fZsNwNx5zkC3;E#a`~LEomyT*P-c;!U$^+1jSsSKDdX$Gi7GJYF2Wk#GL)Y z4vl>_0v@qvq&Y-cP`>$%f_zN#Me8{TH0X!RkEcBr2tZH2MbKs9@Cjk-^W9cq<)8ut z(Ck0JuA0a}{M6TJ5^Z3lY;pueld3g&-wDp=L0RlmU>31D)}2{V+TYc<`FwHPNzNw{ z8r%54@>A-mQWRD_dLG;X6N)cvtbcr_ck$EKQ;gQOEArKG1c~(Un<=U~V}~UPYaN2#_XN5m2Y()`5m<7!Ye1h#59l%a)j(u4J*)LjLiR~UDwSWu#X(E& znN6f!Q=P`VY3+m8!;AbvW?4za)5CLtN=69lF6HV0nUad~`QaB&2CU<(E-&=@hU|~T z-Op~-09~)M_9X7PVS5^%?QmnnjZfU;bqPVZI|NS6gPnAj?$6`o^rFhc3qg){*6*11 zlu3x55Ac6)f_&gFM}G--Mh6grV*obFa9HbchWA$Uipajqj;knY_K~6JyyojlE)vET zXL6h<5(j<#?op5XcP2sUPpSlTNl=qpMUN9rJGgc<2z=-*coWn+UV9~6=Hp!9(0Rz& zfWunxDfpd57(z37k>WMHNXaLu4;9A>1e}rTYpN7?|cx~Hn@pRtNlh?r@l;RSLlw5Q`HBVpN&N(uh#(| zV_DZAj#xtPXdZqT&g%^yHcg5rHZYveba@yZF^)f_8)Q|MyTke6`+7fy1-twiZo^B? zi;>@#*M0{Q{rnpM{}*Vj{*Aph0mcl9yROw*dohiJ95=FG9lyEdLg`tTU1cTFyHy?R zd7$MVShFMos&6ylIzS5Q&wI59qXA#&A4)t>XIUIGs(jzut8Rm&6lr@@u6>}Jxs29j zJ@f74+aGsBhQc7Lm>PH?Y=%lT9XLy29+eKX?L--5MY%ZM*f-Tt!gl|Yd{fG0xQ8I0 zG^Bu+iK0S|qrjxAk)gcar#LgJI&kN$n%T#g-|bW1einjd zvz^PAk$YXj-`*t^FCt^@40vu6y&%aDzx3x$37(-DpPYs3-+7uHRMc2#mE9OAlgg6# z3Bz<|gMso2K#FXfD~lhoZ@>c>6U&pm39!2!7hKNIu*v5t6~sy`+TE==D?VrGTQVa? zJ&H06R^XyJ)1NAfIoCX&y8N=JEq=ol@HerfIwhR@GoMZ6sK0gv+GSH5m7&7t|RFboHNTH zjsN=ahI0}gpyc+3X|ilbcOPQtu;fSc6iPptr$?I7_Z)SFqD(q{n&RU(B8w?>Dt>X; zK5Y15pahF_;Ac;kw{N7F9>z96#Jfk(eW~D<5%6FZf^@PJ+8*d7nH$6#GMcEMJr@4X zux>%CbDZlT)y8whXjzT+5#j@<@evLUl8=&P)o$Cq>J&1V@$VIULu2PBA!c#VyXhTh zJHuwNlbYfOoE`F=RAhD*7gSv8Jl?8SD)TnLbx-x}=O1|z=;rhc|4kTz!tkbN#I$K7 z5v0oQ(-%^W-p1H83EPPBoVV6au^{L; zW*ttEy(@oZcuQ{G`8kfWcKgMuv$xz7hOD6Lu^Z5?em83p-iMC3Vl4Rx2U9P(yZXjB z#6=w?cj`6C_^=e49^V?rdaK17(*V8GLE{I=yUX5z)rb*i*fxEa=lw=vU!U~P7PmY* z(x9w*)wBS6-6k16goO($Yw~M}duNlwdzE2Kd6It0E@>7!i)}V;GLTPW+7JNQGqG>q z!;z{dlz8BY7}jG8cGDkLLP3V2XGtnP@B>__S%roxhdA+-b;G5AkTZhoxlmoMH7e;kwt`fLA_VHin zas2oETUtsyKhA!1e`2?km-o}U{0Ej4{)5pR|Dh*O-_7Vm7RZIn?!J)hNQitTA0i$i zSC?FWwV*IpEd>x(XBj_5*ghdQ!X?qQIVgY$)uGQZARwM>bYPx8HQrbyUqLj@tgT4Y z9jq-@F}lh1=*)-s%|eF3oOmhq&D$C^WjXb`m&BOO^Lq<@B8nJ~HOvpr2e3yvoK@Sm znN9sH^P3&`i}2wdt!?X(=`zq!vjtIY;a`8)!U97CN(Q^~(~)ro%?iY?qZ%GmZPZ0d z{8Ip(QW?eawmhFqIfHHTeyaUNV!M@MLuPo=(kduSa_19E=+I?6g&9%{Fe)(`L<5n)<1Z^HVG68)c=R%1QA*N8_h%)?g9f;`_N4ey)X|8gjoX?)_W~ z|1)cW`Cp;G8t)8LZY$+1hxoDWRl;7VaX_Gv^R)H3$crhr|) zDSYya9NQKkmGT^nUxyzUunnL25wo(>`d}ObDK6kE4_N>k^7#Ly>mqBRH46CaeoX%$c)RSEUl(#6ON`I~MaEwAG7%jF`}W|*ji0Cg*N4umvYjh2t=Dt8 zSAAH|O{jJ^;lOQ0>r2Mn=rI8w(7^|I``e5lCLK7VPleY?1}<$J?G^1AQsuArz7$#{ z-c3+A4)Hiu7TYemy>J1Z$qNK7%I< zJ-&X&p~U9{P}R;%_~LII(yFZ#Jy24^PUEQ*cn#*;gK{+)<|kmXIKfsJ6+k^TkS6op zk!)&8z|YhFOGB4R+jCnf!7P`aWbZQ)t+?Y6_gT@Xa0Y*$IV+A=L)QhfG6G-RmCQ|$ z{>b#~`L7zPg5w*?tp95Ddhjmhah|&9QNh&z9-t$R@G;@RBK@eJyEI6r!-n-~lE#3K z8ywJJ!`5PaOz+V(%23)G#2N@Eyk_uycf{Y`epqz;+cSQi{*Me@;+MNuW_MMTRFw^K z90+(Xbh7;kPZ&Pk=5d9?XV=QN?2UP<*#sQz_8fdV9J|V%XIs11D2trT-6a}k>9m+B z{($ND7o;4gc=tO;GA>W#-m|=nP}|s4-O%E28PO!@xt{mWkCmX)?Y%X|PlAQm30TkC z%mVg;8vD;%`eUavSXt|fsUg)M-D$Azi&xTaN#5P}Ki_H+Y#p|?LzFU~J6U;*#9s^_ zzYFeBLItO5xy**oitkypQUJaGwblBuilKsAwBpiO$-Qa;jT^&2hTt!Y_N;Ks*4z)= z12@pCTX08`xvzh-U8jEYI4?2`G7cXW4q>44)*y3$vWw&Uqlt;1C;y!R%k@bSQ8&n& zoy+s82_HHTe7ewnBQDPIf!Tix05@-S08|i! z{wM`6gdd(9*bT5k8=BW3%xM5obOv49S$P_mE|z!(D*${pWHFO3htV#tK|(UUGZ}X{ z6=>W5ToeJEPv}V!g3h)LNfDCt3;R-x8I_5P`CfAFH8QAVz?44`|3;EP+$r-HNBAQBa=tE1A4 z+YZcezl(LaYyD0woXjd78;B+rnI*W5o9^zYe z{C}(+^1m)Vwj=&)FH;t1{=ZhssL%(4%`x|xT2$=>pBH@rdeqz3AQMLdGLx(W{xCdsQsG*4ox%&}p^5S|p;EB?b9sxTqmPQ{m08y-Y| zp7XB?sfZd=cAtOX*d*%(_n*Lxt1yJK$zbDqx&ZE3Rqq-k6xTo4mpyV6&+pGcv9B-b z^jVDxoGE$dUi!&uD_?lE+vdkdv3mS{bs8dfo1f_w8SHvo98WjtOe7YexRlM(VvPC? zlcsg~S4OFRG-r}RZSK}uEk2?aP79MgRnY9CL4GOt*~&rS;?oQ7`@|LiyUKKJ(|q~E zk0;!^mg85>&F_C#<^7!W6yfO~VuEbJ)06;adsRlbm$9jtp-lFgktM~CxJLLNuyL?a zCh0xR?K4RISgzycHlOk~=CDrC#lz<-g8kTWFW%AA>Mpn~)E!T=48xzEB+;NqsGe!M zQkUr}7I(%(*WVj;?3;*>={pSt9sAZS|9rb8O!mHhl>5$*%P0zQ} zM#t<|eeZ(r6kraEUHU7c4)X^zQ%Wb1I@A*@o<8cL(-b`lw=W7pH9sOR&5ynrvX8sS zcSHJ6?rxJr0~u}W0<|Jrwz8H!$?hy%^B`EQuk}RUIaF>PB7F`YanT!%SqkH6q|=l? z3&4oRh=>@)eUk)H&ZG_fC%u#_ve_w2o9`Y@t8C|K2iGeZhWBpXv5<^D$Q=o| zM{^EI1m4%*cxGu~R(#@{@n5GgV|wij3rw*HvRpP2%*nBf#b7DOf?2BU zc@TfYnB{F4vf@up^#*j0oa`gk|3YrQ-1 zdKDAsPV9p(CRs9Kv;JVb`O!>y%qt-&_|!p)DSk70!WitK#0`VMEP)3cCBqmxhcKK0 z0S$AcatOmM3pcUM;CHQst@0_MX^;|N=5C;Cawz~odn6cyX#oIJOS>8Xf3in*RTJ<; zS`ix=L0kX>3jsJ@$|o2x+aFk!wx_8;?3e`vbRx;nagHzs20d&>Qv_312W;xqoM?uM zK5frnFnm!4OjQb#D=?lD%qulGFqFs@RRuQmN06I2CNE1y|LI~pZk`}QZ{4t(Ske@! zO>hYsQ|(iJ^+fUb<6EbT+L?ql1_r*7GG?_}Z>#(L=YQP#;NviSHfRS*yjj-)Y>{=V zJbEzd@oMi9G}{Jk?`WP7f+*0D!Y|jvF=AciLXa<=6xQnaq0>4)B7L~ zR~);q8H$Vd-{q~8Ig?KGYBbTuEJiprcs3&U&s%JVg~UpapOcPjV< zW)H|Ewo7x8Z?=9^b+sGBPo-3~s-_f(7FTYYY*ILD&_7o);%DY;VEcmqe91|}@olrq z{UmtmTLub#1$P%le4z!W1UpDA>@D17y{rF8K=C8q(GTzKBqHm~zxLK)_#20iAq+{< zgFEQDctlx+vG0L;k^KrZ_5kK-a3#12Lpf6hCU;20Yb4v|hQfbFh_#aT{?npGI-p^G!+rlr)fWh5JuvLUv zyqz*dI`N_d;mKh@fG7d+`p7qX0f+FPO{46y?-F3we${a}EcS9eT<)GcsVTz@{hP+o zQutS~N$hv}Ly+ljRe07P%aU}+6<7u@nvjI%c3RHm3aW7Q+}>AZY-U1 zbQX=B(wyeFY+3wl=#^Q|+qcq5K50c!rw*l_dOvflnj<;dPj+^{HX^bmGHvq!^VNb~yZ)uPUinZeS5GZia}{h!#`!o@30 zQ?GDW4}m5ybT6QZq;2(LI7!oM;N*F{u`G!pm5~~el~Uoq`@mA3Sk~vjjL+kggSUYO z-exlR{YN)7HzyKwCWrMiN^y)k-Ro+(=RCpYCdpp{<_euXJ0Hj$1<0QPCO8h5oHo|) zUD(Cr3$OGUI&rWi!g_K#2Qo)h;wg_TaG?4>!SLtdT%IA!(JEcsluZmAn9C#g!g{_lAbj% zEgaF4`|L!ofY-~)g=39-=a1DVhAv4(JHsj^Kad2cS{y) zkGu-Qv*T?OeW^P1w4jS!jCOms&QhgKLn>m_VITOuZG1&H8PdqZ#Sd*W}6N z`kbBGXEYyuie;Lu@Z{ciSQQp%!(B?k)eUk^%%vlq1BrxUoHRa_UK z{h}SAr~n?-Z8fslx*bXlwp?-8%o<_GPlx4A4UFqH3q+AiR1z$15d-cWQdx@7` z6cXn`QLo8%!*W+gU*FIssGKen$ltt)PX-tKhoBqt@aax}xX%BCTm0YG>tXofhoAbZqT7~o&_j0EQGJ?{LZiZ}coBxS zIfmxEG{_L_B!jl3r@(F6BLMcfD1Dk@<_s8(BO#143Tu#+9Rcti@PCW<&@d!(QG!OX z;^>;|YY_IN3ZGoR5bA+9)N?Hgv0v!f{-5ebJ-b`;Sp0)}9|CetWn%v@jEteleu7bD zspd^o#Hwx`!#)ZR@-RrL$DS(@%kEDWo^UL#{&A0fx0U~pjL}B0eSa4~S<~>IrCfj6 zxs6#<{whSHovviOr`V3rbq-PGFf9nex3+0xUdxZ}E9s}G9 zu$9hq)B1X6{rNlT^^RW7L?jW>O;Zo~>eSrguRrZK7cf{4C!W-l7nB^lp3>ixb5yZS z$LGLX^jz&5=lP?&Y!X9ZjBvO;4%+w0zr}`&$Vi7ha?YAC+4}|^re4~-kEYYRFbw)i zxCXq{>wR1AEWs!%?KtUz`=de*Qi{=gwFCPwk94hps@vDe)s(*&|4ZH@sTFf(pCiKREV;K38&Lrz>?_ z5SH$r0YY{a8aq9fxLgO@B5&J&5bs_5B3iA#Z+G+VMMo(&zczEN3&9q8MmC)Kss;*F zpFZ^1^Dl=!sx@CLZ?|fyKz)j597ln8m__`qKB-mT9q8wvG@Tl!_+F5iDHh3~ev$ zQUij%u~+UF_3*AK{9m{g%YKm-Pv-9PJ&ig3YtiJloSOyXTRGfZu3rUozt{7Ecs%%~ z2hiSWwdzr_qnGbM(X}|UZHk4RExQR(4S{>#`9W}R(BZHW^E&93sbyiWnm&PA!ruM+ z>)mV(P8~0&72%eoOyk8b z8dUcIyh!#O#at>~4ShCOWYCVRB@nuhaR1qo@5!El{-kz=Spiayg|Hr}Cx=rsvE*bb z5fT9Bu%{`(8{w!#f@sDnHY<@3HPx(0D*U4!@~tQe9-+Q&Pq zgi+cg<(ijPQ!#xOb;l$QSg{KgCjlCo20z&e!1ke472{Lydrn*M!qi)>k#eIvT){j% zvr@L^h{Y+79Z9$wzW6&dAMf6%Ny5k5$3Cl@oep^0m@(QG*r_~IG!Hwe>u2=TCQ)Cn z;FWD$+|Ipd0yEd@mkJc`sK!Y(emB9UvbXGqO0tVvRC?a`EG?>em+Z;ZZ7AAlx9FVS z;sl}!l-9oAx2`|wdqm(q@i+ceJ_wX%bQL~5bK31c3vm<1&_edYrwi9>FGq0zI5ehu z0hCKqK{y`dyYr9!QGUz_Yz5+kT$)v31UO&JrvZ~8!G&PF0(t8;E(rR-q6xB;0Gqi< zRUL3B_xsd%r=(f4^5iU;Ivi)W@d;4cFL3Y{szhZLO9dMs;6k9}J2_pzf%K~2X zye^E`fGu#PbHG-Nfe$?v2BGat!F%F|BjA?@SNY)cPtj|TCjJ#VRRFbv;zP2xB zaY<9n%zhTaEU>rVew^C9HSvo(k``w)JW z3R3t-n~+rxevuYfHvp#Jtn}{HKNVa)SAsN$cuK{k$#aO`^s!}_y1rSvf2(&F{eyeA z|L?n$Rbzl)z~8&}II*=+zhlW_8;o+SurJ4@FOsR0SAV}en!xjdx#GOXjw+F7xp`Oj ze%(<~7@M552?!!y%!|z2^S1WB_83n`0Nfq!(%QG&02jW&#cDy^k^AM@a6=iF-TVAU z!)5c$f_-nSCu~J|RW|s%fiR4{q4hR!dP0>9ff7A^^roh>p~a}P-0|HP%?(l=B0sYT z;?y4m-af1mwmLq{O5;_ z3lza}iAxPpTM9{{o|9G1A|Fn8dG<4`rvzC~*1ijU0Tn4Y42yz`;ho`vG!!v6K1jnL zWs-n8sPfD=n!t{#X%>x|)v|p-IQmG#Uc&sX$I{%aJM~~AQJ{|O#So1%#Be$fTqs&N zIVqQpVHxsdNHA{*_mPwsduBV&|HnG@)1(Tao8D7c8F&Dp>F{x0HN$<${Dom85ipGS zH?2X^=6e@&|M@^i)YnWr7fjZ9Kd!5P6o3v3eP@mGUY4zs_#Q;BejQxp=(YIEr-2MU zEF4B0gp1EtHj=Qdx$Ut$-n+9l7 zp2nP|&4S!tHw0A++?54VGsAm57sx3Mt_bkTjgQ9Dh`?VWZbL9MkqC5crN0omttrRf z6L_~y7>XCBR$*008S{P+q%w_J-@*TFuY`>0ndZaGN) z8qN69V-fExBnW-9$$K(k7C$@y-;AHI>w&AI8Ok=dh$UoYqCyQ;Y%)o!z3A2P`31v; zVqN#K6{GPQVq(AK>FR5G&~wJDAC$h?VEF%3Hz0g(N)C&y+mdU~KoY}TW&^Ms-x`iQ z2D0MZCSWqQH$zuvVT?O6%Ms4fWU?1uVGcr7V(m=r^-pi#H>;5?*KRVr~AyG|IY2b%VsUj?yOlMYk2DdoVnX@%k%vR2=@|Q5w(@L zpQcPf47+Z8z|)d(wyp$ngL)$H-4n+C0%6(&#RFurh$LJH$|u=7uwIQE>ytJa|HAs5 zHZ;jDcDoxD;@x%OE@Ui{9oG{^uGAS(6D&F&DU512ckR8jN*~W|==&^sJkt;=o9;>X zL_S*qnRgcDe87sM)fE5?K6g4he5on-1A4+^8fYb_6rjI?M`5?JWO*0fwMvwx-j27& zGh0xQI>84?2cH5?ktq@F*t83bTx3=Rl&!29QmmrrMDhkyQ!gsv0dea5xJ%tt&8sx| z_jv-t&&!e|KXkTx*pIhhX4I+L16DZ;j%IOJs$ufZA4`iph``n>hE*6}yBYkMPeiDJ4w=rDpqMI`Xqz9)9^O>gHuDV0< zQH-xu+^#yG7KOGR?5VnmOF=PR>0t<#$nU#skFG9eoseCEF{P>`8a2Aw%hE}71a@>+ zRThrcJa2EW%V$nzU-AAebpM~Ms>+JgA?FpQ&`ZJ?DK?aVbO#uKdYzlxU za4_O4L2`4)mss%Ree^^=vW3h4jw9H<^c&PgIGtrsV&_Tyby3-ZS6?2Hfsmw&ApWH$ z$QU$n04)UG;{-_a&b0uOCkjkt>nNPgo`9yW08H!X1E$p`U4J9Mwdg~$2j=wvxRrPn zG>}lBxWdChJ$M)Rl;tmTzvv%K@AN+d;%_zhm@NrM_q71;+_VQnQ^7W%SGR&WL|yO# zY&?6GXBet+x>kZ*Ic*-PJH z50sdG1s`}eca&l`qZ_mG`h1OM+(&@#N21yitngYob8(t~od!C@THunP#1^Jy>DhFuqSJsV$rKmP*yeo>yZIv_&1;KeT-`mZyP+&ehhA@& zI+doSSh~f%;TlktLEZsmO&2KbwxjnVb}bxlyYWyyZtCX4q>WEnIQ8yl5LNEaNu1)aiXP?HE@E#P^M~XPHkZoVHCO2k=*LsqSQF5%4LsxyDg@aGcI>=F_3J5= z4np6pWhuYB57_l6T1S8%2ze`@aW(Y0zMC{^GA=Gb&p*dc*ad{xsI6!y}>^3??%-<4FsRvo0xHU*_}9b^rK>#;59)H)_hz8oNxe1&t^a1a>AG=YK|zRl;LSB@Ox8qAN_e@npP!Ou_+uIGzH*ak1XtNDKTsC*ncD(#{%64hQet=f9J7h7|csAUIem z|AiOZYDii%Dmh0yFi@I`z4@+%!kfo&4`)+&YUNW^vrg+fidF`1Os-{)%Rtr5Tsi&Wfhl`^i|RbVfzde(3|W+I%=(*$W>i_%6wS@o*=Gf*Ks zcFM9XW~uly{zkNY5j!cd!!l_iQA;;jB$hV~Gx1Y>M#nFcOoya{c$gOFyVf94^;fjGlr6%&|ET8`xc_eJl&9l)XQ-VA1ABk4WR=;6< zk`s2J2Os>b^Lli+m;Kk5p5}IZ=3qgyC4oRphri@AxVI+XADZ`|v&!P<8`mJ4PJ^Uh zs|wX71e_7jOpD|VTYRh#LMFrkWi{u0AAP((<*V4LHn@Ev0vrKtPZMt|x` z%pZ|<&@EhwEeo$J2pSiXxH@SXU&d5R%O%BaH$$M-+3yc5DSt3u^t$tr*h z1xss1Fc&`^23#s5YY=JkFtta<4w4r@V#}TbXDV$Cvbwj8 zbwLN&u^fyaJJ*4q?ts#_$*w%bP2Q|U&dWO@mnK;m_xPBKeqR{KSWr>ItO(LT`q(B8 zy}JK6-3<2@P^;_H!u^3WiZg`Mg?2*xv(4YEL5jgQdOUywl{HV~s;cvJ*b0mc+|8Jq z-Rs%W<~4}E9K`RpGw-$oH~0a|-+>^UOx?iCHw;m6qgsRX+eXP;uJ$5J*ScDL@+*>)8BOVEx1 zc3{L7EWh`H38SlfvjJ=3SUv04(f94ee7d93PcE1G%0O_Q6f5d6nk7Z$=|_rJwb~Oi zGZim6uN?+1o9o`b$&V@5y{L7@M$PvX>~wvOpjTE7<|S}TH+J1e=ey1k=5k?&be3i&vN>vL>8d>ON|V8_~u)GDWLU( z=0Nw~eH-P{zvL?+--rI?Z^ym^7+YWZ;{(^%Dhh-}Tnj{%|I^-kM>Vx}>*Ap((xoFU zCfgakwgRS*;urHP1$^iTyt??_V+kdh!GXdt141qt!D z+~wO_&v(bU``qvB-?`&{e`F+CV_nm9L^PSH#pGgk^A*me+ASD^}PCp*7ncn~b zbK?GA0dob|=Dq|Fwiq}61-7t7uYiOXFt^fzq=EC68FCp+Z-TGcx9FdbyxZIc_u}qU zGxPvhjQD_^n{Jx(9Vkiq4VxE)(!eImS>LmjOz8P(TX4S(zJT@biPRqspwQ?R5!4WT zO%6S0(DDtEBnK|oYTM6npHF{-bVq=J8_09~%uPGe-#ERwF#;nA!st3CKYoR0PJ>tr zHuV>*rQ|!-0s~PNcjaGD77!ci;%C@m`VS-FO`4~?2CT@2?RMxe zel{rE#s6krX;JfB+(&Y<9`qHsi2q}%{<{;G@`>c>Fl}YBZ1d<87dawn+C6olVzBzk zrHw1`wFUWew%0lR*Q|!~<;+fT^?CK=ojsj&-!ToA4t64?1d&Y|l?Bp|(bOs7$lmdr zSwie8+?%d4nio!o%q?$Vb~fB9USuM$fHTDgcKIz_4oA9NsjBr}oC$AfpIzz_^|v|K zU9u&1Tc3^wK}p!yY8xCvv-K-Ht-cg{3;e^U1$QzI(-g;CED7*d7gKdAxKfhid3wa&v6GK>9J*EZ=f@@xGR*!Eq~*7hDkaogj4wVD$e zkDs5cJ`yq#1V#ou5}z^KuIE-R!rsmw?c?BNae6)cbaDDhh@gAg+2*tUp0HGF>b}&k zVN`KgoLxU5warr{jqO3I<*W|UuBybDHwkGId%Q@B1-7Vyt;2iNUlY#QtZ}Z^LJw1 z3ge%Mb^m|xCg+tU(4C_pV66pi?d<4a#YgmRZTSHI8{1WR#x4q3Cu4h%ISir89XoOR z$OW>kmsMQW-D)%~%yR1srN7n{qd|^GbKr}!Z7A~i;N`q_iqa_b7$(zY;}V)WC!FyyFf={!HFUf?Rn6 z`JKhb-y(111Cc#ciS`b!Q6|s(`+Jz)%605n9%)#PaQm3t?0os*YOp7YXuS1Wr!aRJ z5o_)hxEWXKQFz4QLnat0jec~e9sCA)2)dmjC{^dyx-XrLL`&nkZ`9e=*TpSKUlvow z)4r4xe@WmhOM9=7z!}*pZy_^I?30y;Y3W$@uF_7*J1?FOuLWI8;u#}>4cWWD2Rh&1 z|J#C{;s9>};;WGxt74xAD~}N`g>Q+Jf^0xdG%sD^3%E+wxxN5YTd!dQ1kdt_-MJ)t zCwZ=K&r;D*35?{-ZFvLbc$hFgelMou)|ziSXwCN(NU87aZvDYrwSt)R&e)^+VTW?7@mo zYUVF0&`{Fr22~JN-zIR=L?*wtFood*kgnibKy8Hr>fiHr52&#Ja1~HeS7v#~HY*qr zZ_ww#6ArM4k`9T& ztv%HoPp;yw>vVPn6}|CdMA< zoiWR_EW_5AUxBm3c2N80FhK zEDWdEE*O`hQD{`$`W6u zb11=pm(=Sq5FmjrzCZ=@vjbckpdkrCX;x6uvgH_t9vXlH4poDxfdXQ;91{Ts1mt~h z3#O+vO%rxNlfi1odKlRJi(v{Z?P#6_F}~s|u=phkYzj7&S8g$vx&YMd^$X|%-XDhz9T<8_plMy-cjR=q!Zj=7v}6*y|L z-}IoVcEBu4+E)7?(9&N|At#*p4O=Q~87f&v02|4l-I!p1E^@Sy{ego2<&S*zpD?X| zRQ3FP?635+<}u&!4E=$y6R`3V8BtFn`u7dppWhu!S}idsejpdGHN7+NO|O&tXu(?2 z0hY-WnR&0MAQqD3ZGGbB!UI+hjviUxKsnuRhp6=KQwn?lqd)hCSAifFpAJYtK0+v2kc{vjp(g6VthNs*Nny!PN61SA6% zF@gR!aSpS6GXacF1g3j__AHQF`+qny*sboLem^UCT2FRIZSVl&Ajo+GQ!jsiP4Lf` z7T2AlpeKHGBljPLIp6mZ|82!Nf2tw;=}G=aZQ;K@wKeiT{F&OEowfW*yi6`QH|(#4 zlK@^fvsgsnc>-^o7eSswcuzb($N%_=AB)so`OmlHn8@W6&+QC<<+xi3ZSt0UG-n{% zBV!l&W=_@xQP}RXJ&NAK%t3XX&n6Gh_q{$(IRn20R8gt{cT#XG4^niKGNyQ4JtPEjSo%JMHH+H|P^8*`-RUf2)h#h2Te>wf-ynhuyV>*o z5_oL4Z<7n7&wP5yk|?kvRWk9zJo60)%-wGgA84c#7dfS3CY`&*Nsin%9SQ9oktHqN zM|k@!>@<{K!QKn)34iS-x!X8^kwtVi${9mvJ4%}Rw4YV6|Mt4@$4gCqcikTu-U>C_ zS2uwlZL>_s6uS!6#XvC<`$?(I&>exUcJ*bcM3L*09$enHv8e%5mpeodELxApJjyIby7#F5DK^Sht z*?c|Hl({KI-vOdCf?#&G{|vLXnS&7{s9KY>!+^=`ay(rKs30@y zIK45di|kq_r~%_kD{5{das(6GL6^P!X6-DpV)R!w?KskD_@?S~)b#o?n5@pFtTFV_ zpxc>sTBL$g1G+kanS}Xx1aWOrnRwb?pNiY@70H2ZV--UpVN9|v(W z+2|eq@)HLtbog4wSt9+-A5@f)WpZ=X8)AK>DhI6Rg9Xlw-gr54rE-AtMrP&ylo~MA z$4q&tYEoDf;r!8~qG8tTD>g(|S9~?vr8pAD(f2mv01%&#b{+?G7dtdY zZ+N7TTVYtK$&?sHjNhXf#OV`HR45=4Z)v~GeSvm_EE~35m|F%s%J#Iuw4a%*PFk5g zlVKz8*B|P1;Iy;q@WBsNN{wQOugO$b=L=;G|5yj0V>@)m5} zd!=$Saur-o@?}{>IA|dx1=Y7;MOtl7J$PH-cbHqPAMJrfRRptlN*TqdB22cA8; z@06FYexO&HpwFMw$wOHmKk)?WL7i`ft}wjCeHlk=Lk3trCVY*j9+{>g0apBSjME{Y zgDlu@_3l}{nR5x5_3orm#oH2@cPV=uTu$?)YR?Oc*$m*I4Z=tfz>}&Qh-mx<5mxUP z4$RT7AS))@Po?X-zMI-2m~j}m_a|}4*QAEk7!To8BB5%i*32^5P~C&5zA0hyn;HU) zZ(*bMPSql5p|-9vrQqX~1@G5rW1+qJh;zwP^*G8n>1sM@m2#B?yS?_f;Pr%#eA_MQ zGkqb4t81>gJSdkg>=DbztAN~u@}zgr_*L=yc4}EhR6O~Pq$|n~q7I!JC z9iFZ1S#*@HI7zmp?=s5CaotR%r$bVV`(reFV|K5}oMOD3FC_pzq_7=sI50Xv zJVNdu$kF5Brn+NVdw%k;4}7EUbE(@6$9hm!dS2?H{BqjCp?6CnkF#Q~ zH>t%{@I_UXo_+h*9u99&V}qhY+4@j9rU`#2AeYee_(HKdr*aEQVT2}|*E`@4nAT$A z?q@rBN_dmFuk_59@{C=~VxxQ{PdkvdN#39|lX*(078s288hdeRGw#b??6A^wml5Qy z)y=T*wPN9S+BZP^BiMXRAXvr;(KSejP$a|4g=0@!vTfaCul0)tm4?L6rRe4Rs?r`B z$=+~vL)?d;FtqdAdAb5LDIf%ojzLM*W^A-bDAkvhm(`UT-Gekln$1=x_Xc*}F%ebe zNfARnTLY++wCyZ4#NEu&jCk`^Pd}=E@Q8quD0)rd-|!$vnK* zwNGS!+J?PS8AKad_34?(`YwDR5%ms z!~8j+`d}oJh_tLEKO2}>tX;-nlkx4DyRKkObA%2X*j{hH;%s&5RJ-QP3{y0zzrCN8 z=Cxgi691wr7z5r}>M2q~fjj#7VoINDh|Bdo(>)o2vK(g~gzdN=-qfkNg&|;wv7}La zRlE;MY+*|mH(SiNK$ae@l-M);CP(o;;*G1;;OU6Xn2(9OI`#L~DBxZM5v`9*j-KkDUsdp$ga3;k4n9wgj(*@DW=Spu+ z+MLHGnwFNCBUIb@v%Ke(<3kh8gbNemU=`fW;NZYH)}XNxiovhbxm%OQ+gvDeN$$_6 z4vNQg+wbjc5=n6ura*X&kg+7!mJAV~o_d@Ag_cq2hEDx7#rN-93PX;!nOM0KenJPZoGyQn+d)m@i%CwslLxWUF)U znPa|95^ou{Cdfjw0pWC!#Rir^f7_yUQC!rqCw5K`Qx1sXv_lVP7_7)h>gnHfY-QYa z&PkS#Fp+={z#u&dpy!s5AS*{}U%{9z{l?b2t>(o&yzHdRYc2QvogR!iIt)lCL?s0K9M?QATkp&iL&LSf0zGuidU z!uWmY)rPX_J)1I7s$oyW1g`GkP_41$P#&k+yu)&jr4lsCvz_|$JOtBD_H(vj<2eR3 zr8tuIa^!swAx)1}3KyciaO06vW5<2#=z9`hlGy8?_4chRv}RuSe2??C+*F4}Pg8b2 z-YkS5r%9OU`Nk%;GRPW#E$kMWO0#O>_|{rW52HB^jMB~xZh^FGq|@fT;SHv=MyXVDYE zl*DjDUx^%9jGB7oxo*ZN|lH zgfvv5KdOY3U63&dcs|nef?<~>K8t%4#|#X&KzWb{o(E1hrIHtKDV4JId;3C7jKAtP zS)XMqOWb2CAi3MfU!C0lRe7dRv=PR*7ySE3ny35hq_l@k*@TCN2GQGxIqtdXJ@Z3a zE>qX@#AdkUzj{D^EO-2^+OanM=h|m}29UeqyI}EM9xn9IujzHqKWEpof7KiOvGzHO ztL!&$n7a$XLfiii<^~@}%r0dTpwTE*(q!fxe;o~ZVKs4=S9n%`{8HyolTBkBEjde}j1R6ptme($(JTN(RF1Nb@vl5v!?J({68HIUOBm;usZo6gHlh zW=MZ*kls{hg5PLC#Gzo@FL7?8fF=2?Wn_U%fx9zFCV6K*rC((aEr+_v*RxWIn|wp0 zZ4bhIkR00&6;OPEukCzv#!s5J>he|9mC)PY7WqA%urN@IS)5uLMLfKFuWR33;oXMN{(TKsfhwwt zdoq$8NSK92h$u%D71ikk=Lg>6JUeU|^J$9HV0?0#*o*97?B2(ZEt4h7y}#~@hY2=F zLEjJ0nzR>0iGCdqXjA3_^>y{L62KVk&Rq?v^u2v|&Fhl3pPoeTl6Vpv(a~%SfUqF* z0$H|Y;pteu9iVlt=B@84Ux>fA^u|#gQxoT`O#B%=v4#Zl@CD!N@t8g4VUKHbjsU^CkDVx^gD>I9r{EEOhiaEH@!0V(|$r=+Fkp&^n9@$gv*6 ziu0W;f2U4_nYpjU%0H-zcRJwnXjmccW{Hv45hj^>?h|hnz!*j5WZC;usjNaRLHO%& z!U~BCy-9mJ3|{S$Dir|t+EOQD>8wpV)5U8Qu^`Ok0>{K75A{iaG zR?PS%O(=@S{sM>?*V$iZ_FP<-^LW@w)c&bOa}vMCha`SvF9QIF*Od*U80hU82g%r2 zkm2Z*{K_`{tXcb|Xi7p^*MXyF#4brsW@wBK!AWQ8;rj1%`2!7GL=@lEcf_q1^DbE8 zTjO3O2jM$ajfE8FBD`}kdtCN(K|+K3+xo}9;1NxTC=l~yue0|oaQIR+e%7P%o;&6C zGSR>uQ+aos-(*z+pP{k$ruVpt!;P~v!R-PX1IQ0c%WL@(0(BsvWBsCbysb5fdWC8V z9BF;AdWNZ!?RHP1sn3nuM~nH$0uj0MH2(SK)yd;!T`nYoS+=vvS;H5O#uq}kIxelr z6aoZckUenwF7ilCw1N4JnR?@+!q*(7(ypGK%HlQ6;>LX;7f_CFXH>w(g=TynlaI7# z3ODS#;E|eYlc;?Q9c8C=t#al5SwY)eWa81Dj1YN>HBJD1$#P5?Y;KNojhAn)-H56) z&vSB^f*TJkq+wH18jTL0w%*UosP}P0jbZ%=k%5GpnQl%P3#!{sPJojWVzm`_mb+^? z*3$y)S{y76@$7xnDtGBDYC(+4q?du0cBvOyRs5BR5Iq#QypTted=qByT}jJcuX|r0=4m-h6{l zxX4H7i9LD}Ib=@?4hSF>w71|ZDx-@7XWI_zRoUD^M|#1qSIfd`xUXrqvfc}?+Fx=$ zk?DYLKIz7+D;PlDof1F@(sb*Ch%@O#pThaL7JqkN=u}Lg{e7>CTf48b7WblWkF&IY z!Hpv*;R7^2vXmJK5p|W!_o2u2g*(r*!=(Gy6`f~b+6plzed^_TAEtwWlPO!Sl;b23 zz@CuV&UtH=;PYUXh;XPa@%G?6*zwi(f>X0Bq{K`@XN7U1d9}vO$Bk(@<~Q_1^UvVH zWzP*G-*J$=@B?cVQUjt*9(JINq@LKHi$CQD<=?FTpeXqxRsdH1_|mM%#Z9;|Tx*6J zfci9X;ew*#<=1S*6!qG4=b*|GDM|5{*RJ*Eu?VcU1%iz*$Vc$F=6=k%FEAmsO?4=n z$Bnk!sizZ)9}cEIPWEs0(pxbTwVhdMy!a_pSGjyUVQC$KIZZPH1jw^($NKL!yh*jb z)jB>_JB(P`&B9|TY`xu+p;4|ofbx~>R6&i~%|{_&qyh?hl&;X{owqoSxQo=$tx+sb zsW7`3d9~&q7sCqO`r_fn*(cU4?aO1(8QB(iBx)a+-z3SlZQwX6MA=#WMdkZsZG7{b zOrx&EhzZ{GPcMlo)n&aXV2jLq1iT|;?xs0xr=eYNd^FRl3;xQyffFt5nA#&)rF@3hY1FwL!WX7e6e8OapdDOyUkXn%HdJ?_Z zm7-`RB_;VvsSPg6gqbN@YM+w<3H&+0ABt@p^94Ko$8>3M#6EyPPXl^r1yX`?`$?Bm)r>@C=7C*L1HLm6h*eGvA99DPsGhS3Ma&92f%~e3}0CtHi2{ z!rdR%I)%kOH`sm=#{L~`X8SQ3!u=Tz(i8ion$^auUOxJF$z{l~KXKo_V^=@FxWD~R z7f1!YiZ-<|lUv{ruNs?iTtDK1#JFj1sB-s_D`BC>I6}mYAVJ2dq$7A; z45@i_W+WEh6U@!xA-HPy!PXvok2R;-v26K)@JYvxod(qYjq0K=%~N{@wT1A7@=f$T zl~jp)PwiSp3i&FFiu!XPC!vqXYuk@$g7jQa~sc_qASv zKnTv4T>X^kH!7=AxtadKM<@K^O~wL19?#N(!=SlR@vv}gCP?>Udu4Md7N#47GH(xf z7*y7|LhF+fTkh-^ZY(|lj)(z#tYfBkiiw14IiRhR$r-3b7q>LSQXQwa)F)q?4t9MC zn(}&lvgl^#*F5d;u)7V2h$-f3;4w@40c_uta>X!Lg7`-Ip^1ww?r~10XlXh*`olT2 z=Hy-Z0TAHa336<}{XZ%vXwt7mvMtM@{CHLobdy_L_^yF-a!{rw#ooApgsA@>ib`&9zrLze*r|(2@UL zBQsR>CxZ8N6d2wndVw{kzx99l$1^#LlBDU9Fm0AB9!?D8ISl1_c)`K_@2VavNH}-w z>(1$o7&2;kn)v{8(yz0qI|kBIF{oCc!wcmy^unCHJ?SmT3Jc6I$V-v(rdDy*iH~)D zN!zsUps;NxVW$O5X4&DGl-pYenDhDiZ|r~QJFtCk?hp^X%c7o~;rRtr#O_1r?nWMa zi;{7l7FOq!bO5SMvB9G9U9#yT<5LzBt%vq-?CRYU<{x*IIsU!o^KqmEaN`o$V0Bg} z@*V{tyr>a-**}DTHLJSH;Gh?K6wNm~S@`>-aO^Zr zva3-gX}OhCm1<*IUU!==SGSNgal^|jdPDDXhr8^Ybp8@&09d=vl#f&l?(jt%`s8&5_G7 zZ-yE;kcS6#5dGwwym0hmEFIe|0D(sSCK$d;luNlqYqSxWprM|Fsnk553 z<84BbrTSe&zRuwGkOw={#0$GL<7n44qa?A z5RJwlxkJ2Pe5T+$YN0N**y)d5pIDD4d9Om}?mapc#KI(A+^URe;06k2h$f8^I>X-} z6>8!aF54F%G;Fn-_+t;ER)oxixMEP&;)en|i-uw#E4U~$bAu4ln&g<*vK%GCajP=o z;($(_qQaoIvX4glU_alp&L-4Zt0u|B>#PEOG@I>5bT*{VkXpJZApm2HP2&x^d9J>% z*|GH@n|_U%perX>rm_qZsTWI-3W!bB!t4*{U@QVQw*ThXyj+xTe^E{pZg%l zz~FS*!WbV(l}zd$HA@GKOx(vyLb1 z$KFdllLYYs&8#>ZY&#+grUMd~kOxV<5?nw~j{Rplo!6>`^|guYIEAmh=2{Y8TQeYU zAg>V2NMXR0G~1?okeqiLt2V4&Eb5>*ReY_iZ*R>bI}^@IlPd{|@<~!w%uf=p9sWMG zsQ~v(M~iZ#t|Zwqrj9-P`Gc3h$QNR5U5~<$XhGC#0KzRGrw~M2?e*Ki>E0LP8n@fWorM3x^FXs!cjNsytd+^0k8T@Z)JhP%O zBB#)Wh{7czt!v-vKA(aH855^;tFVnCu+qMrG>=(JU=0j5ClzCe^sd~`BPAE?3~Mrb zzAv+8H9e}{MobE3I%YC8nfyp4l58C90v;g-q@JW+t(wVKx;mt!y^upyoqYMMV_&p5IWcH+q9X2aSEd_ab%XNd9Yn@4p(;cjX9In{^B9-%5x z&o*T0>eKqZJR(W?L9=KX&S|aLo9~7_;y3@UoZW(c}+LlDi7K<+A?9LWI?2HlzXx zdRzM(AyWi^n^OhLXD?(`znfouo=jAkkXNuM11-nxCPDr5jZSTwtU<8$C;)jHa3RZ5 z9&G2(__$+{EMRE5+=7d^mHuw?ozK$V6mMs%D~CD|Y%W8rBGRthElSr7cW`d8=DUxG zw5R(&^Qa_Gj=_(UEID3E9CdzhqV`w@TUpXB9V17OnR}B2|C&u=!7qi+DzgJx%{dlB zNHoh>MZuN2*H@}BUiqZ~z3n`eL6DW0%ep-YXUhTKnLZeP94T8qT!&-pc%Hu3i?(n| z;iQv(Y@ZT{uv_0;n#MJJU3IMIXZUoQCJI~@Y7s_p>W1y;4_73n4602eZSX{$UOH`O z9mHzg#9><^x%>K#pu867`(=s`phIvWr-EDQ9ro`%&j=lwG}meSkQfwWRhNl1mrOWl z+8uh$^o{%i=!W}00gf}~3DG4;=f@`}2~@{JpUKlf!<>~ntsl01#H?5@3#YdoS&e^B zNJo=!jkTGrj;e${%A-#}v2l5-CAMz$xr8GY)G3$Kj4rdK^+sTvnzRB%s+${J9_mvF%0ICbD&sfm zSbG;%m|9E40cfg6pk*t#wxEQN=A=j*3D-J4E#l=QS+RQpZfbk51EHzuDjmvjI=4Zu zt@A7cCFFOyqBD@tlExCdrZvq0)4b%aPCayJHO7M3*JNH zE4@6-F_M8T%p7{g-4cs|#YSMb#T|uar?HdmPYz?zQ1{I7lr*dDhJ3FKzk#5Dl-G6n zs_fZX0ni80=Q8wP!D7*jy1X?1AtDwX(;yb^bi4Dl{cG$!3x-6EjX=ri(LI z#Ms^qqvQcm8{p9^e}ap{4zRuE;=YyUwhuO%^gUagol4+wer4jh8o zjoejIJ51*XJUCeql_Afq++{M*%39i8&t31`UXo^fzekfvJx{r*I5HV&g_-qA+jk`X zV%f1<9ui(-f*mmB2e_`uNGVhwFnd$8_!Jn6HX`=`S8)QC?SoHcX)=W_Ak`15;kEsk z+F%V9h2GShE=PUe!wi3E#JMBxx>JwQuFHTgw9Rjnge{YQeA)vlm-U@C^>+MK#_<3By5c|cssGvczk9d$&#vL;V?PSuITC*;Wy|9F zUbtU#o{0KfaG!zyN6BX!^v{fHeumHY!NB6rm2v;s=N}E_w@wg_rwab)%JrKT8ibgd ztGV{P7zEDrgnt!uQU6iTW#FI4p$)KH_+QbJ{};#q^@RvbtF9F9l5(;uu?5szo@m{b z{6$wh`NYuLs$|c^xEX)cCv8%8D{E367?#auR_e;pBmguy*|8R6n`g(KcOx)TV?mc20NDSE%&(gsik%{H(C#q957ZL;Wk!GF(dC_&MI^7p4 z@L>if+Pqy+?{0&Y9a!PR46Sib3rA@hmPBy^nrk6#KJpVFFk>M@ktd$=4DsxLx2|?) z)m<#*s%*?rhP_pC;-WXacj>92R0A;t*LKVC>phf9B%#h6 zmlfxV$g|uJLO*YcCH9`W8G4;29!yrHcx~q)_mT`-oiyLp1<$~vt%VAoTNayB;!iYF zE#kUA`#|7_#cvi%6>#hrH>bcwQ37CDVsS^kEF~Ra%^eTSIeSdY?bt|||Fsn3l>t-N zyQWH4HU;(Y`jZ3uW_H_J!&~}64O{UBCDcHg5RsKU+cMI?JWS)ebi+IA^X@5={8O$t z<2>N>?r=<0%FW#~!_fHB;(cfG{nvg#|25}x|kk`{Hev^P^_@a?gsk^_tR&eWm zd9_U7DDh+&??*$-RgQ@({*&?56!cg*9(}itfef8R)e|OFzY0nyleIjKIb`^$Y(ITl zz##KJ{n4?66um;C1;7M$2ykKrmdUg2DA{4%jvS!>+^~|`BiiRH)RWev-Xx9A$qb!W zjm}1AZ#1egtk}@_lAB8cp_E(oz;b?IxnoAZCB|+QYo@F}c-h=$Rf3@9{pdne)Z9j9 z-G>`aqIg)`mPs3qV;bz47fn6mk;zR9$?x)4dYt7xY{`|7`&28pPDrr9UI8DbO4M|!SLJ0(Tcj5DKDDf7Su?;`JaDMxp-x+NVv zG%j|3$C-yCnT^x28QRA6I?wEX^WD5V9suEAW;=0Pgp~e-L2u>4F}BJf!an zl%EB`Z_Du;_P{3TM$;jr@nD_zv+?&Hx7^-l4=Z^uc~w5U{wj6P*<5~(gH_g@4m%~q z(cv^Wp`du8r(=q(W<+U@w4HhfOMRiXkv=|jV9KrKL}GHOW0+*g9`zNLHb;Bop=G4w zE1KnYQ86}CeB2^HCNnqCW5sl>0IF#Dz*9Z9)^w$;WPJ1BJP@v7w#7aZ&^$eUaFvn* zK3DBvrTun9!;4uvp3fyh(raQlmKSK;xi=q61pJhT)* z=xSjbRL%23%7*9S7Ka_?`&aA2sn0pXWP&=TI*UirAhhQ|#Vm->u+!PZ{4+65J0BBv z=E;Uig{=X~`%3*HihI=PS6+4-l)WUjpZZEEvY|8s^HhDHm~xGri2=QzAhlUU{iAh( z@5`P-yUG0}_SF~6A~jnyJ~3!&`}FI>FB*}`J7TGRJ>e$H}EjU(PZRAl>af|ZZw9K|?R)DZUl{#NCdNqaeshxlyl&p=Mdus90 z<(h`XM77tFWdTZ)23FbO@iK0P_1o%Mh-if;X8 z%AT2*(_%))oKi^MXw}&X=RqnBqIdyIv&5d4+M_qq+Lp3CS5L5Eec1PLG ze1or1pFLqgC~0m$V#1kuJ&8CBjJ?i3i~b%eqR{bKMB3r5fah`Qs_!#Tq;RjcRo-KE%@W>%yTb9xd9_%KksrNZe!H*jni%~iV>TLslbtqrf3C&uBDs+ z#XEW(vWp7~wxGkWSHjSmKr86}ZUz6I)88I||H_>HYo3^&ixz^SfO)@Duu>&ZFXXvA zC@oS@IHc~0~HUReIaeOH_k^wXHtSXfNe)IMJK!G&b|&6nq~_abIULA*y+ ziqDdWuZ`ToFq&Ch`QH`NjfDBJ3>a|h3wG~5@k`I3JWv1#%$#KvdU^cfKIA)=wLODp zT2uC3**Nn$rCIWF^19zz7PsH8H?ZIb`@{-f5X$CPT{QNQFZ9q<_y!>V2Tf7$N6D zM&h52K}q#KxX-`*LJ0iDX_mqJHgC{B9z65oPyYQke;Tm=jj@sY$xXaq8m{ zl55Q3GNki3!stQDb0)NXwP@N3yt|ghc1VsX5v0M}Sbl?Km~VoQ;I5*~ZxHR&l_DHt z92?{#3@-q38|IVf=h4mbpabpSPb(;H{QW%Ov-f}HiE!WzSvhla*)~t49O53TMS|nN zSa;~v34uTXXHYxo`LUhM5^EsNm{~hORIx1f##BpSGYPV2J&&bMI^ZL_0avf1Sg!vgd|6z(R{xDq|c$o1H$n`&r{vVcWH9B)9Oiv8+yVWOv=lRue z|1UhzFP8i34Yf*$l}1!4T!iK#TG(2%ZNjV%{R&_2{BFJL5&qfZ4yEq9`5brrGGvN* zXz=0ve{aNo@m_zy2680?hnqmHf7rnm zfl|0PyW*hDwcWov(o_FWInw{i(xCNy4YHOb&BZC!T!w7R=Y3yJ List[np.array]: + return self._encode(queries) + + def __call__(self, texts: List[str]) -> List[np.array]: + return self._encode(texts) + + def encode_documents(self, documents: List[str]) -> List[np.array]: + return self._encode(documents) + + def _encode(self, texts: List[str]): + return [np.array(self.client.embeddings(model=self.model_name, prompt=text)['embedding']) for text in texts] + +class MyVanna(Milvus_VectorStore, Ollama): + def __init__(self, config=None): + fn = OllamaEmbeddingFunction(model_name=config['embedding_model'], host=config['ollama_host']) + milvus = MilvusClient(uri=config['milvus_host']) + config['embedding_function'] = fn + config['milvus_client'] = milvus + Milvus_VectorStore.__init__(self, config=config) + Ollama.__init__(self, config=config) + +vn = MyVanna(config={'ollama_host': 'http://ollama:11434', 'model': 'phi3:3.8b', 'embedding_model': 'phi3:3.8b', 'milvus_host': 'http://milvus:19530'}) +``` + +#### Scenario with a Single Table + +Assume there is already a table in Hive with the following create table statement: + +```sql +CREATE TABLE IF NOT EXISTS test_table (id bigint, data string); +``` + +In the Notebook, we continue by writing the following code: + +```python +vn.connect_to_hive(host='hive-server2-0.hive-server2.kdp-data.svc.cluster.local', + dbname='default', + port=10000, + auth='NOSASL', + user='root') + +vn.train(ddl='CREATE TABLE IF NOT EXISTS test_table (id bigint, data string)') + +# Ask question +# You will see an output similar to this SQL: +# SELECT id +# FROM minio_test_2 +# ORDER BY data DESC +# LIMIT 3 +# And a chart display +vn.ask("What are the top 3 ids of test_table?") +``` + +#### Scenario with Multiple Tables + +Vanna provides an example SQLite database [Chinook.sqlite](https://vanna.ai/Chinook.sqlite). After downloading it, upload it to the same directory as the notebook in jupyterlab. Write the following code: + +```python +vn.connect_to_sqlite('Chinook.sqlite') + +# Traverse all DDL statements to train the table structure +df_ddl = vn.run_sql("SELECT type, sql FROM sqlite_master WHERE sql is not null") +for ddl in df_ddl['sql'].to_list(): + vn.train(ddl=ddl) + +# Ask question +vn.ask(question="What are the top 10 billing countries by total billing?", allow_llm_to_see_data=True) +``` + +If you choose to use another database, you can adjust the code to train specific create table statements. + +For more examples, please refer to the [official documentation](https://vanna.ai/docs/). diff --git a/docs/en/user-tutorials/tutorials.md b/docs/en/user-tutorials/tutorials.md index 373b3fd..6f92486 100644 --- a/docs/en/user-tutorials/tutorials.md +++ b/docs/en/user-tutorials/tutorials.md @@ -23,4 +23,5 @@ Users can refer to the following scenario tutorials to practice how to do data i * [Visualization of the maternal and infant shopping data on Taobao](./visualization-analysis-of-taobao's-maternal-and-infant-shopping-data.md) * [How to build a real-time data pipeline of sales' on KDP](./Real-time-incremental-data-analysis.md) * [Build up your data lake on KDP](./iceberg-quickstart.md) + * [Build up LLM RAG applications on KDP](./llm-rag-guide.md) * More... diff --git a/docs/zh/user-tutorials/images/llm-rag-01.jpg b/docs/zh/user-tutorials/images/llm-rag-01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a921b893f8153e06c3c17ca45eb5fbc6d2a0d002 GIT binary patch literal 130590 zcmeFa2S60dmN48y&Kb!J3P=(V1c@>P$&v&C5g8E>5DAh&U=Re9C@7$)jDm`aFd{h) zIf;@K5F|^GID>?NNnh*T>$~^9yZ?80-`oB7?PqJ#r)#RKt4^Idby8K6N61qEn~8z3 z0RVvjz)kQUK%NEy^+P=`0DzepAPoQj9Y6))2dF^^%mQdZ1b)B<5J`aYdpZRGBzOW; z|CYxbynZ{t(!M|Q%a!6G#jiPNjz6UQ6{cGGmX*8;s9JjX2Kokg`1*+)kvj~i>KdC- zeJc?>zQf|*LALio$sf~z*HmAk>F=!Ibfd^K%p%5mdT`5=76!&A^uITRna$bH?-B(Y z0C@WZ`kyq^6|q0-X}1{MjD*UUy(n_FGv$ zlK&dO?&=oc0yf?f%zoZAz{MMc%fNHR#m_$w04N`V>7pTle&66$5a#j+D+t0P-(dG& z;BR>0I{zL1js`A&o0EC~K*a@i36rz4zdHahiGX=Tf?eFfa+tJ1_^^+wrw<7Gfv}dh zx34P*zXD-NFb|l<^sRi=^S>#_{Wq|)^Z6fTIy<}nfPZNV_$2t^xaA@HaXMUct6PM!bAYf51NH%`JXS_XJz_E9?s*&l@dt(+jQ zQ$Nx@+>C#eAMRme_iLVDPup)J;`@68ysUrJC)`8tN4kH|$shH1^D)%@HU9;FgCA}8 z4ggdCtsDldi|<6VB2 zzK@OXb#}XC_#-_a*!st_fgnNtT8>|!C|1IsH2>`Is0YF26OOSu?FXeq7OVl72Um?gAP`yzGlUbu2Z2JwAu|DLz*C6kbcNV$TZ{&WCOBCK}o?x!9^iNagaiu zLX|>?!j!^>;w*(b#bt_cifa_96n7}{C|*)jP&84zq4+>CMX^k=MF~(cQtqSNPbo{O zN~uR_LFqtwfzqEciZYQhi!zV0n6ielgL05^igJZ=mx_jplS+h2mP&)li0TxT3)N++ zD5_+t9I9tj6;!QMgH+R07%CDqGqoVK47ED7F||FlJ9P+kJarcJQ|fZ+HtG-5bJW{3 zG&K8YBxqD8t;jCG#rL4WID{S;^2if%4oY|t-?y*&~4YO^rbFwS2Td;exC$qm` z?_yu%pyfEoq0iyUag8INqlIIZlaf=EQ;*YyGnVr)XB+1n7Y&yLmoe8xt|YD^u6JA* zZVqlGZd>k9?t9$z+*A7~_Z{44yzkP!w0*Dl4ei_G5#rI|apSqcQ_M5Kv%@REtIg}i zo5+je{lL4&C&H)C=f#)KSIIZdPsK0IZ^a+NpUdCIzaqdTpdsKQkSOq4U{sJoP+IV$ z;1$7q!5+aaAz>jyAwQwJLM=io!uy1^g)a)<7H$y!0_B8iK|P_jp=jum2)Bri$R&|G zBCR5r{et_A_6O~MwEx|H`~isrrw+s%KphwtWe`;ry&!s9v{@7*1{E_Cix4Xm8x^M) zR~7dV&lc|x-#I98(C%Qu!ODY+61)<|65$es5}zcQC1H}6CG#ZTOVLQFN_j~=km{4B zkXDxVkiI9~D?=f3RK`>0flU7)>O*RWd=BLu8kS{})sYRBEtH*>+b4HIE=I0WZcScH z-a$THzC)gLSo!d!!;cS-DR3y5D8wk#C~PQ7E4nD&Q+$7f`G~<0#F45aSS1-HH>F&q z5oJzgGvx&3W@X}0m81Sgi;sR$5mPy*a$jXwl}pu9HCeS&jap4t4WU-2wySev`(sR`3?9RP7M{u@q&U4;6Z+!m#d5nvmOSa3htG4TH*Dr3z+%nu2E*!g% zabeN@nENgFFCH+DERPjWJ_wxC$csB(7G4Ej&eH^LUe4Z@#Xp}OL7r8#1M#MOxDNS(+>QIM$fQOyWZ#5KfRv|;qKs|;7YuD*>q z9Fq~V8EY3?b4}=4^tIVI!??nDmU#d8;RKBYqICA6e4N{_OVt3Nvq^u-D zvP*JzibBer6msf?)OTq|({gXp-1NCQlnzUOmcgD8o-upN>{i8Xk=u#4H#6axU0F(5 z$ZUq}pzNtTC+<|;6}x-$E+NMw=fgeSd#L+@_ixpl&+5K|P^27>AMOX!<(xY;! z>U33qwMlhzjYds*tz2zE-Tu0J_1yJo4Gay}8p!By^j4!^<4Tiz(`+-md9200<$bGF z>$^77w$65g_LdHv4s_?S&blu3uIg^p?#eeu-&FJ{_msa?ep~+T=(~zumENj8wZ58u z&Hjb~*g(_Z@xk`@#_!*JF#pg$bZTg1*l~Dj#C2rxx(_9m14oc*1@%L3nY7m5p@rn6B10L-TWfU^$(7|#46Pk+w= z`9%i+;cvRnxAWWa2lyA6`};3P0RSutIHe5$#*F}w2f_!V0e}^}w**fcZGhs)ksl}c z>$l?4_(g^XQ+}=YAFp6*jvN7nr$1cDjQ~3x)e6mV zO2`3#f*nH14k5P!P_P};ppXI{zrF-QK}khTLrX``zzAk2X9Fl8l#~=yl+@JU6fsC7 z_&Y$wPR+4jL5GIZ%9-}SWiG|5>5u3{bxWGKPxfQPj-2<8p=a2~!^_7neo#VEN?J+z zsEVqZy54bp14AQY6Kk7OwsxR+=Hlvh!QI32VnAR}a7buac5;Jby&dkcb zb2le1|M8Qj1<#(pcwJgnUQt<9UDMps+ScCD+0{KT`2NGt@W{u}>6zKjbMp&}UzV^N zUpKe5cW}FV-`WKMD1T|zkCy$RUF=}HD5$6?sc65o3qlbBo|NoV)cX}^ICQLNoiB49 zP`paVrJMe!q={bi$Vm+MdH;TfePT+};@EFZ``)s@*07lWRLg!e>~HNF1M~oj?*}CX z1tm2lB_%ZtHF(g_fsz*u4IKmB_k-cz4yNx1%eRB|$3X@Qfq-RDQBl!?|JfMn8QK2B z2YDP++}+5d023tyBqmCB00t1*F_WA%J9LNk?3~`JsGm3lYG_-H!|CW zbf!}8Xu8_HAOkH>(mV8~6yh^+hYX0>K{16S!*O}i7#Ud1MwJu}G%cw1Xoel$dO}@) zJI8K4U-hz@6MtRx^2uam@GU}b4q`fu47kJhxX>F>cruV7Ne1F!#0QAQlVqR^zfLkj zJt_PgX+0a#E)+7ulUOH!K{g$Ac#FFBG=6k`W({|y)>v_0r(PK(^W5PxPtA{99VV5| zBR09M$pB^c?tL;a!ppixn?RyKcP^s;Z|^EfW5pG0U#r0kUq@-`Pd!lYa40ik$@CW5 z>k=9(J$%P#`g+>=I8oJiUJJdnq+ut`4-E=m(DVeu>3YS{GfDmK0m=`?9A8?LWic$@ zzHsuewx(cgrxN1jE|N%XLk1e>NY2Eo(PZFZC}K*6kmmKrw&s&~$-s6H8F*w$1|-(e zy9XMwP%tc_%_5-zGF+!ToyNQD=NVp*?30p}?kl&tlg(hsJ3C6(IZgn`HPFhUp*!r6?i;d>0l8(gYXc4TEvIy$7Uf z=>ih1{8!c$CR!q83mJgGKSvDy9X<>R3S?kqnGEP=lPo3?8~Ty5`p{)9cQT-J3WiZb z+(Dc>2U`?|;uy$)=={$P`rB~-vmua|wuL+bj+z%poFKXf_UbTnla-Y~jY$7$@kcyE z|3EF=o8?^p?)dvF%;(w9ZvX#hTsCC=?Djup#~PvXO(a1KOL;NQqB$7pJn%B=&F7YR zW4T^se!Jbd3jx{Z!z7AndAS$MdqLJIx}Jzw1+T}4b)1wPUf;hzzcx`+KepCu{y?=^ zn$6bKmCMQrWK4{DMr0takPI+nuiPR79>iF@Uhi%MQa*URKE#Khuzor#+>OghTUZ0@ zPI88CPm%%8;nd-hh|^@?jvcX*42%ZNmH}4!TtCmh#{q=gM?8u<1$M_;HW~0H1DmG9 zBOkE6&8S^yAR6yW2J)O5+8g# zo_)>%h;Y<(k~+bfSd5&x24z58@J*Wy-8GcpEg?~5wWzQNzS;^;hku2#`e00asR^0Hqp}pHT zFqLUrz5E|Nx2G-L>jt4lpj4KW%uvOVt6e_don+Rjr9xGQ?YJ_Ml=ZRyT$;DFSlocCDw`LY41OJy7iq7fJy>sqTZdj)ZnTD<4oz$a2EszZ!$n^=7VANk zUCo|#NUvCyjMWjo=8*=V7^`(b96iYOU{r*|m^&Em9@b~}9w8^kE9!%uMxS*vFt$A! zqEn-JAe-t^%4>QIA`Zq((8s!OA0ieLXs78eR1e8VAd234QKR=hPIQ}Upv7qeB(Fc6 zoO!1)JOrbLO+A8^vRuW>;e5|vRT7Jo9{4ub2$g59CyZQs-!SG3#7)JFOyAe&z*j&e zsY5c=0LpeUF!d10d#K?MsY#d#SCykbA77JjL+Sa#Ad0Oc$Xm9$$~f=bG=0mX(N^G1 zd?QUQJP}$hu{w)^H}{kJU~EwWp$^cv5etVIy#zV7PE-xL`U3tUU z627BCxADnb!hUFgS46H`bmHws;aoJTJc+AWCk)u_Q5Kr%1!A3CvBpjsD+wIG7m#hgVMWE#nE zl8X$CrIBtF$3$yN%t&;w;_N2&lN!muH4VpMnE$QFe2a>&&bwU#A+8ZEf@$HqtR$WU zf@=anViJ?!h1{UVOKc-PA_k*K5tH(;CF1gCcf%=C#|JVnjY3zDT438D1knb&(TJxT z5pT&rKu`Pl#K*TlFp`C&ifC@avToB7_K(gd;Ir?o^2b$XvUX~Z)k@5(O_c)*>_x~j!qNJRaCG?8z9mk6`XNx{R^k!9} z7lnMuqME7jc*x>HVoRe2XIn}OP`kHB<8rEChn}w!o7`vW$y4eWfd}&Bi zQH>-}%-R8C)Z&e>NPGvq;l$QYI4zuewkX?faCLo%<`$&q{IuYH@BH9T?v%%5>hhvB zg@?E8iFaNWJJ-L)=}qCUB!!$7%{WGBVQ8qA>E;ZG#3<5z=3lP+CVfELjAbw2?oJg6 zw4EGD*4}%H^bN&IsY$0ODx8vdMoU|TGRccpP2rhFwxlsH-Ky&cbObGD}~l~ybx zOu64mTd*TulXI$QWigvgHEy#nY$r-gQw0$VditjgEBo(iDfLwP*=qQ*Q)Kqj)@RbLP_{ z9?2a-JxrY+b)!1Wp)curj+ZiqRfK;mFZ!@ggv|7nUS=}TEEJOevG-x*18-RAkOU#%PAo8X++$%(*nK^AT7azRRdkKrLw!#1cU3Hne>xhBZ> zbSwy0RmcFlws4$&*g8Sh0)ptXCIcd7WS|waYyK?dCtiNi%g=H2lQaC}m_KKdpL63+ znc=4_^;0_hDK-DpCjRU6Bk~|o5$DWdHv8bH6wRr+l{EbMt*yKLhv<86qcbBO{XU}T z86_0Y(n1Q8pEKMRN+4{&yDKCgG9gwpSa(08God5F(63zx>5;r>FaYD#3Tz>RWP@-X zLG+3f3eP739i*05WFXgc*NT|nOa?TwH;NJ^f0pZh!0bwX z|7Ql`zl){$2Ym_us4wE@^S}4yu#!Lg?6%*dA7e^Yd>m0vr~IBYf!tuk_!5Kb!N3w{6l$|5c(56aBtAqieJ0xF^>{IT zyt@Q&^;liKmdvJLX&X>1z|)OdJ;4B#leNnD6#Z@eG)zJmw?qyl`|mM_l7_uAwp z{SX;gZ>t1XBlVL3=C_!8q^s(aL>!pqbI#W=40KcZ+aec47&Fd#3Cn*1dJi#!Yc_XD$TxoRLh8+8E|b=hL?K_qQasD$`zVqiWx#aS!N%< zIBe-~e4xcg^t7Cy!ISP!3Ji=)Q=F;oFBmDMBs-L!hY;6sG(k?Dbk)84A7^~PBQX~D z>MXEH+YOitcZuaQcLdBzSW0$ZkBm`IjMFlNsiJC0bfEoI`~rL}2;Cyzg?xgpNFbz#fQGje6sgzg zDqcA`f*Es@3>1Lj-Tl2z2)qZPiwA+H8wD3fZ7m{7{W`#SL^?7sT!>g4MlE(jH!R>R(0i(ul2o@uD9G*d?b?A-f$2M zehng=!o^|}rkFbtN#b6LUNvRmALd?sGAYTYb4jGJX}uU5vpS|ZoJs0{3e}lMXv|E0 zG@L!{WpN$OQY7cS+VeK6VQ@M*ZnQ&Slv}18ox0DEucbVUXT=jMYKhY)15}H+I4qCR zsIriN<@<@gDyG7KLq|)rdkSLq8J;xsQ_zMMHpt+bFxibcF`il~*y0=0%U`r*e4kyk z9m;rhjLz8AwrQ&^*fxA3<(a1x${s%U=}U&eg)`5d7+%ez6mLy5$?Q;jC$kZ-Z9t4~ zV2e0`J5oS!#H~9A%*u1)R^8r<=Pqq89bvLoW1ni1=1G4~&u{p~?bTsgC4@UG>v&Wz zw8A2V47l2_yT2z1g`!Netp-=+&faNuz2VxZHoJ4d!?Bp@9(yWX8*l|3kM_PNYq8yc zg*QF0bHuzwx716Rq^`Bt^GK&18`Sey<*V_E^}%^Q5jaH|@gT~!cQWOrC*u?5Ak;&C z=WC9U&$=57Gwl3s^}HL83md=ha({S+HU@D4el;9P;DXQ4Hi64k=$lkxl~O1KYR{^^ zRZW!|owV?uZq0QTe|mGO1gc_wXA$kY&W|&SIEQn=%ZH-i*-Z%g&1J?btLIH^vK*UJ z#DX!mQ(V(4#H;K{whRNb=YpAls50D{S=wf};F3jts7(8)#C2u5tFpcYOSZ$-l1`5w zpFDCdL=_c>o_d}ugEhRSMHT8|iODSq%NsYFNwRm%>Yg$66c%+4ZR5*x6F0W>GgpMH z$V^#`a)UA5NPgcI9KiyA2$zRojWED`9vbGqTyEy7+;6NMMx+_zGG}nFM zW4+sJxC8{&ZkqZslwNGP@+ci=<{m+$fcfcT5VTbkzhef+U2zC4TmGdG4W-& zf>`&IKrSB%Pa2_mebi98sYY`tZZ~4{qr1EP=`>^LmYAagaaTz6 zr5H{t+?8$kjeQ|G>#0GZOncea#p(G$ zggQ1iX?pB=v}=OZd+#E#bKz{I>KVtdXH##z^i(H-JIp+CYI-)}SiD#)`{eYa^hm3| zOy@P`D1)dDc!_&+Z!(&03O9$>ad5;9wrOc*Ev-JTt*uV#N_ZP;Gf!_>+f~{#(J{yL z;-R+~dK=M?g1Le*(3RH2oQPx3K7GQmc7zA!JbmEqH`i9y#dYiXN#i%tO-lOljL&p; zC7FS!B3xm612aZ0SJ_vIPC*|7N=8&8E_~ znVj=CKHQep71lqgQg>H^k_Ne|hDmFIy+XFGC&0_(8)Gj|6ZvC+?dN6^|+^4 zGjA6>cF1HZpW|6)>Q#G7+I~1c;nYkLD^9Yv3C3i<%#*dJOiBq5Z@V4BAzt>50~CA2 z_Qxm)*k#a9g)~_YaW1F`?S4?oBNjKv;&gg)v@C;;y zduuOqgdnjlii2L)uiS_qIbYH2HX6 zTmx*ha<=?!{Z4#Y?eo>TBh&V7oDLs(p-ekT1dE%zg@D`c+32J8PBl(3IQ&CF@c(EK{r{xr|2zcpztY0R`X7}lUS{hc z+hEiQ@v=|sFMJ@tww2O1PVvtSzF`_!04mI7zV;}q92!kBcgl-(JUV$%#4FQ+2ub3zxYAIQZ9(zCTw6wx<1%2 z_j*IDc$)G`W=FG=&_MGTdy2^^b-8phpn{Wo&}-TX<@Iu@es$Ny?@4LaK=!VD+g3%# z{6a_XM}9A88LnkolUcb^(b3a1D-@qqvG#@xoY+g7?q$$AjywJmxsR|fmErYrj)w?F zheu&}Z7Tvhi~Km*JaG^^6o(Z(&iHsa-06wum4FgNQ0UDQuT_JD#P^#E25BDFOG-VW}}ouk6|UqBS#;Tf%or`duLwQEj{3Z>^=fla6yQa(kh`YRT|NuSe3LD>KDs6-*InAf5G*qOP+6zThq8rhMlQ`-HQw94*-$P$RTizhpJcq&!UIr0itF{h^eObfI1rvM+uI(H@ZzGKB8W{UuLd`Kt6g!EYDjGYX0Ej6y$M!xjg%AJ4r4kK9`qt+}~yu}>5 zq{t%O2{5q$VCSCYY~Mo@I6JnJaiEmSDA2MO{|M7EW468>7ysOa?Y53ohB3R=h2!1y zxoVa-7tX846wqqSB(xSz;v^T^d?^S@IKye8u6#li&wH9jMaw*WyT&)Q{f?IAkrre) zN+#ANq@O)WTdjN5rs>VJ_}XBW+Ma@LhbDtgq~f}sH@IKhrVYd<5}1jGfy#pCBtxig z`y|E+86(V(jk-%y^7!oHK-o~X)s1u6T`B_)(*>lLgt#)#>9o^{9;jO9@B|ej0%yo< zBepVOI_K*YtW_pmXzRW+5-+{@IVBdEqmY$E3fHeWlBFL`%*l&B66oz>g58(yhFT1< zn)DpKt?+5gQMV~ShtEb`{qR(w6cyBD;2&ID_CIM_{735oMw)RMNZ z*%~)i-B`*P*je<$LisG)&+X5i_Ir^mD(5XWS5)+Yn#&4q6G8WLZ-M{N-U^WaZa=BC zTEwIjA*JEMU}bRdS_fZ;YOe#3kqFv&5(`M+R!ke>P%J2s3?fO#A2RRBP?DsPdmz1a z-bS=plL2$YE=RP=;!9TC3&a<2UDg3BGQe#?R0Hj{CctFgE7%NZw=IAXZWt0y!8Sot zSGpu+)X&0yqU9&G{2W9-dCO0(`2XBw@vjn5(;z|w?F*OQ%1^~Nkf<@F6k_EJSB%;d zPq&R#@47w{nYcH#t1a9D21B$VmRggjh2S%{umal;s;jVmJcZAezlJSN2IVK(GVWuE z(tgGX9p^>eo6&49;?;dX>uEMhOq-0LoH|i^w9Q4Kx=wA;*|WOp>ENvoML7fgS=n~M zUjhc?V7{o)1D=nwG*-2!gT)N8jLUUaRQ6qB^|z?k1Et+Bczr~l`8VnIJPNIp2KnMp zJhB>CX!J;%`;_eLDNA*LVhVEB2&d+pwo5aHm<0XB3^QcF4m_KO&}>PVIpnItKq1 z($$K|ojF)@8qPWky2%XsyU|jhm%I?SzQ>42+f5)Cvao>LOkG4yvXX40E`ggmhDY_o zH#uK}`#|tM12;fsQkWK)8_VwzN2F#LIKW-gqlS!%93F7P^_S; z2I*n^SuO>f>qFOqN5>CfF!2<7OhdY5Y6{rfzNqY5_c^y`6RBn z1R|w3dc7MF2VEj*kYXlhNg$$s;_)XQf%E?o^thra09sy|arOC28U$w-ml;Od_Qig! zE=4j>eZU9abQ8}G2hHBUp?Va!&4K57Y>jeS)2eT){L?1xcenRv@#WvJ>MQHKMgs^Q zJ`XzBA@(zh_ahnnUzW&jJYD_r)%|%o?q1XBhNJPP>=GVPJ6I(sIr`ksF~*l9jc7=rLBHIz`}-V8gcHsjYG^+n0OQB!BU$Hg*`~vCf4q|7K45UEEcwn2XU?341 zP7DW@b{JF`=3o_ah(#zE&Jl&)+eBP)1Y@nV)=5Of)*@x$C&^DTw@D+_Aoq=&B!X^* z<$hubsD^0c(fBPepyMG6>UZy01|1QG+ikr>%5PNwW0jnu)$5y6nyW2V!5#Ez$H~AX zid6sqLM`Cm@h!i-d|c(z=})b(g-WiHdwsMv9di<+=m!?Gh^|i1Md3V#BnpTljw_hI z?x<(c;iDZwKbZXX8yF(;%Wn}Opya{BOp^Zq{V-|JySoodOAH0w-4~&iFy;d(c~prz zQ0e`I19cYD$h~x@VbM4~R0-_1b_dUn{=rT}jSTYM8LJ~LzEr~pwRl_aMQdGq{|owS zKq4@RR*$?%1_G^KL)Q}L|33(!;3MmfzQBIcVzJAwF0TMzv>X8zd>cx|8sE4X(tJndGRq6H4bEvQwi;nfh>Z z8CSa=@L5B`J>L}AavYeb=crbIFNb5$T}aRA4#MrzA;hRBWZ+3Fp^KOlI;3fW7y+fd zz9*=UWPnydJuqw&)y_InOVSe-Cjc%@N2@-tJwIA>O`>2_6o%Uh30erx zCL|n!Eteto*igs+Y)7pxU0~|mdfnxzB87@2Cy~Kb-r%e?$zGCX^XnO00j53pBWu!T zm_UCJqd&s1D2qSe&I)lksny#2o$0zpw~V~`u+mvL?4x>I{Thu$y0mczs@v?Mt+}km zkyBz@I{I8Ed4FrEw~Zr8ZKd628VCbnen02LgBN z(#D+#V+gbjfZ}$GN2_EJBm)`Wy&3c#rzNes&qph`O4LW_hIfM!h|GOtVDA)jB-Cq1 zKVlm1is-7q4U($PfFsRDxg`ftdkS=h67Fv23L?7nvk}8f@I6P19^}6_WN|Hc9z>^0 zD|+oTxS`}paAVC_#AgBMKwSek=lB(TC4Ah24S11EPq;sU5mhKl^Acqi)0+MjR^f=-Qv`s z!l4zzjSVax>du5dHQF5E*N(+~B0NK5Bt+aRyuPyZ5UvoP1Tk)x)@6Co!G<2)8MD`~ zU2A9a>oF`ns^&7$uta<=l#gSd3AT<+Qospx>Y#2Q+~r5*b#aCT7o!BQX31Z_?A#*0 zkSaRmU~@Y!UqbTwdT~S~w$shIMTSL3kbinEt3G5lyNw%HGK=rs zr{lRTV|K&WTi{&R=e7q$`vrZ^8;kfU@<{M$i66?`6W$jjZld_2NakW)@6}dahR6BF z6Ds|?`-+s$>KWChSq>CGDXqCSCmuJd#g(h-XJ3L;&3ul?7KG&^t6i!*HMfOF4lUX9N1oTsC|2Qo_AU^YikpV|A z2(ix${(>Jxh*^g%CnNXhAF|lBz_APPt4_?|2Q+Rbky{AEV2}Q$h9dUyhBVeod4V*2CF2b!(^B5R|yOUhx zS{)a2FTpFV%u!q5(H+;DieV!6g{z7awv&g8>ooAjOF3IFUf%Mw<9F*ZnU!=9@CpM& z`_kWrBibgxsD~C|1)S%VX#|U>ise#Hk1k_cIn~Cw6!Z|6+j&=?HQkCLy~X&tXf#u*dna^@*5RPRj3pu@pJ0k{%AWOR zJur4MDJ=P>gA~_l#?g+zb2fXkqOtIIpI>9)DA+5Z@wVQkNOQIOHD|oC71~)bk18wt zX$kZ<2wu}w9r6V$w)wL(q5}_) zuta}|u#Xb<92O5O5_j>s(}$HE1o@4^8oLn?$efGoXdQS1fB3m>zxfmHGi(zzk88t_ z)c3J&CP5Db)g3&>)}pdPC$}Hr7-xH#CUB;$wtKZ-b|&CC2jaj8#GnJ+RlY~k?&?RZ zAAEx6MR2EGM=O(o*~|^4fg#7&b_3J6s7&6Cf%_R7?(c?sUkqg{+v}s1BBS@RSF8!P z!lDGw2#{*`7S2`NAozCXEGVBi*Tm|v831+j2$ctO4Hty(G_@c5>PYpiIPBRw5v--z zDw@c`8a0{O$j4z}2kN=w&Ey@{NQ}nF6k&*PgUA4SvsnGB)Dx5;PB6n1Ti7VWpCt+( z7z2XOJnMo*^A#zi?O1Oj(pB~GBjNdbjMZ4V2cCZ012M4`v35TsLyL zFy+fjg$)1tHmvbOF?v!tX2Wimcqg>z&U8tp)To@oE!)cDqZ138tAa7fUkYA$3zGr; zfCk?8W7Y#79;;<>megbWNC#@9iR;om&u0(6$J#XTJs#eTsL--zH?W!i@+J_J_QGlQ ze`5qT%J5z43B)iTY?IS&DZcP;va$zd=AX?6=*S2V(ZWGE?y1RLH9GW)255K5cSWVn zAZMo0ZF~89wTmFjKQJKz+FYP`Z@ulE>4LqhPKAYtjyj~C(<#g#Q5$vY1A2DC;?Xyg zzzI-^Lv$WR?5$1iF$|w}M8={&3&4mWzC>!Tm%mXUWZpF#3LV!HBEW_;Z5W7oqp}rC zpW>@-t|YruG3ki*@eif&+2j;3kCi;QSW-Z%cByNUYf>nT;6zAe89|f`w&Tnm7U}T#z@J0R&#sn_E!7~TUS2av-ZaW z@CnW5?i{!8KQU)UuOY2MJFJMe&a|j!;Er}Unq7Y6e8DGejjG^L-ZOmBf;IN8hMta)c%ZJMKW;%K4zz4>Sn05+X1kWh3-qiPFm-pcYMBx4+Wq ztn}8Pr)3A~#mE5ojgXBo3N{> zS&|Uei&N84a@HnHY@o*WBL3L+`sb+Sq-mVAj}0pDiV!Ha^ci->{VKNjIe_tp$+nYQ zZHUc-#oNDEIb8lsx7dtCjdOoZSWO34n2pU^>`nWEW&+D$7EjWu9YKD>eKhnk_&Jk( z;P8e&M|`;qQ$(C!-(?ETCcc3Y861eY7+*rH%bwjV>k61HZvXKA()NBN! z)eJzroq_RqIS`xPEb-iW7kMq!2&%2h-E1a%_I=BklZE%e5PeapUdQK6Z_mAvS0+-^ zJ>lkl4Wqv2V^;rB@b%E8f#E!YGA?L_HIa0<3=@(-@$ze|*z2xVKkYk{qO}KWrXnDM_Faf zODhv^f=QsH0bL2%#3m@Ul-Y&8i&(Wd0gI)>12(+p=NtWQ=%+z`+O|mRDezLy{ z*fms%ytriDn^irI=9TbpB(x!Pi(W>s7xYv*gv4%M@f=+161s2FvUmzYyy$J=Q2+jJ z)BwnoBi~!a!5^YBX4W4EQ!d>q$kyq8oSFF{W2+urJeE6QJe^{1mvZ7nnZrl6iL>P& zdMf3cGLzW1)Lsr}<%Na4NE1hJoyUS7ar(SA@sik_LY0~RWs=p$IA?ogQ#uvK6ia9e zj|*LBdC*(vSOt@A)Y;2&L`ZL|lS(lO?9z9+<$O|&5mRQQf`$90W`;a6VNsyD#_mf& z%s1-;w;pIExOsMgc=;CSZ&i-^gQW(}jOcg}MIEX_GS`*IvwQ-T(vLDb!+)m8;MSx_ zasmYS3s_-83UWhshIJ1MS{UEMe53dg&$yRrDhXG*HkIe#%&_+iTW8OZj(y(a$8+u; z@5O`=VnGH_yb3xNih?r#T?>uO3~cO*V@_`qNw`l`)l7H8c=FR35g_u29D)JwkA|Ur zaGy?xDo(jyG>%FbJR~Cetwrm8t=1ibXyoT!#v86fG*9Z#N>RaYW!=nVwZ3T#GTRq= zJ5P#cIrL;X;PKm$#O%PcAuZdW1Gzz_u;D=j_a;$YMRM?|zu4VuCiaAJOC8aSFo1~k znzo4B3#9jYisLazz}CxZv4d!Yc`RlJ9TNyAKw`(xx%%lk~SCIHHQTODYKX)W{o(C6&mnt;pC2#cTrp}`;kpx3& zB$o^G*^t8gI90gZE&}l;wXIZFxLpU&v|wH%*BdP{pY2awR@iV&7otS z3~eC(qhTfsb9e7&oi`OWK4umrKQo+aQ|c)CW&>AFi&fc`LnllQu2pG7=Q5y%WK1@` z5E1bCos1WE@7k;1XY+?K#C?8yDokeAzxd#2{+3CgMS=GmXOrOU<3xe4e9sFtjBL#g zc0sf3MQN9~Y*P@3sTbXW&T2jbh^x3Q`zHr)TIq8ST=-6xP2g<3p>PH<%nfSNIklrx z0+-e6Aq0#AmO zgb?C2O-XY|Qk-m5FG&45B}ADw(-u1n2-sU>KJg&>b6I=1H5k_Fr=bq6tGP~K`$xmn z|EE0v-yAOgpPQ1H(H?N7w^L*wSy*Bq7bYiFJh8^A$KC(cPPip_vbpZyX$3fFL@Q@q zS-*_+ZysxH;M~Z=%H8Elb4@ru-t?eZah&pbmu~3ic#(5y-9-2_Pg}~tsWCWC!!A{4 zaG$jzGGCe-6sAUAYtCmzX!?ph&dh;{y?Y&A=GEQrBRhU%HEjfLQCW#uNR2p|Pdrp# zlmiPqapW*`eIMvCt&v$C-A&t8?h7IVtORu|Cu@3p7TMF8or1BJ95Xej}4u!NW-g zwB~k>6yGZ#bUxiUWtdg0b+=GB3nbskr(hIO^;4XM(+4>Y@$wAbuHDD!CNEMK?z=C_ zq-I&CqO4Bl8<<Z&;=K2gSE9F zlC})DLi$Td`gJ;>(;2osny|Y5J3Coj;cvAg_<4lnUDEHZWYw_Wsz-k_@I^epyM;QP zy)w0#Q}pu6T%XT$t?JT&bLSC_zD!YfQ7^qT>;?i?ub9^MD~Ilz?3nu68`ZeSz_IYJK#Il*Ct%Xe@FZNUYK9!PrZf7Mn1a2N#>g&EDm<8F6ct@4Ewt ze#QHLc}MQ)=eh3hQpuz;JS^3WHuNhf)s>JqtYi2Ul;}4r9UtF3rmdz|Rv2QP<$_6^ zAsE)X?A3^9^n$R6qCU= z{IrCQtQeGq&-;YLcWYkw&7x*U4768i}Brn(3Cy0kF+$abH1FyQv=aIhqj( zX5^6QnGTB*95Xt*UL3k`-Irnq;=S{mlHLa38cV|mgIUwdDqR~_94Cc$s7m6$;)Xw5~<^``txSGrBDuR zX<4uijdXJ5Ev$4_2acyaJ~0p_zG`0ZoX&eas-`dN6?3c1ix)QzU82{`nu1;@T~Xm+ zH%0J*6Lm5*yTe=z;*-e(+L>;6Zl=YHus}^3@i2Gy>trr(?p+{=*lyi>_WhJI`p$Cq z?Z0{h^!bQxlFM5G$1({t``an3@!yOwrpvSO<<2<7YjVN<1>}da5a@CXd03D1{=4$- z=Ycq1pbn}h+~?+u-;G^xSkaw50j(R~IGReXDkBG!^uq)u*7v9YY=Xrw5DQ#i{s(*+ zWi!zPKTx1XNCj-2;Krr}JW3?1tp8}2!R&}ooYSBlBdWU`7J~_qnfw&*81}d?RX(+~ zbYLvWW~t&T;nG&#iv|%BWT}iXaon**@A2J_0N(XJSj6J9bN<*M(SuI3_g;8IYBw#ZjFNBV^hMH`BwmZiDCkYn+=00}-1e5jJ{U2dJ#;$3dY1!c zDTs@FX5c3O*?HEZnFV?kEwz|J*(bK`c*-I9l7VEn91kDGMxa3yXifX3C&8ji?16Q0 zNs3(JXkWt3qs8+DWJB8l(HXB&IhtdQ#x4{2G_EhaI>|e#sRz{w-JZEoby+zUUt+Xg@0-1^vlv zn!npb(#%Lna8uk0tVM*~gXy)TetgarW;VZnrDK3t?xo-KYZ-t!~O;Z8y77)IdL!j1da@yJQdwlbCaIlRx5 zwTxky^3pr-(jg5;>;OEjP_E&?e*6d$L_v02MGi4HycfijDJ)M~P25q>Zr>YPZO_L8 zsq7PjzBj{5;%e6M0xW4n`R?L*v+z0TcW9n-jW@o6s>X59KyR?lA*Hfo7}cDI)X^P? z*l6q;tw`pIi{VoiGbfT+A8~METD-6D_#o9R+r=K=M_BES*mZ?zOKswZ`tbKN z?GJWL{gc7ZzuQCsdZbn|d5d>V_o#{&UebGQwT4cmv77G|B!z+MP})zeP8Z)S5uX-; z*}eq1i2wRm_`|LL?%}=Uqjy@fHNC&-eqKz^?9|Z~z2Q|56$WYzs~gD47o6T`mPm^E zM@`~C`br2))}@6p4?n(?m; zQN1X`ovaMed>)`tK|u|A%Mo&y{=AanSXzw(o|jhkj=h^V0H&@2)fNP+Q z`0%i5_s2Rt=DVk2{f{VsI$U5-R(WYR>@@(FfO_2EAbXZwq`$;IL!k&@Kcj7D*$u5c zPY{nuDj~R-Bv4v;D#f_WN?o2KondnO`U|&E{8l*_mI#%l;+iSf(FSDSu}5 ze^%E2|2(>t7=+zj<;4aA6k$bxgKt+OytH9=rl9R*{wpohHQxruJ6HYp4ioOpiJ9BT zKR^#8;WsDB>N~kTwRTeRtGE-5>^6hG3e%@Qe~NXRzXa61nB6-$$E(!rc)v7)$Asof z0rh$3`f&y=f+k`x3E46pJjDDe%kxCNC1-+`pXJV%p`(^lv!gLGaoA4wBhr)+Iq>Hk zPa!I#7xI2n(1QSF>M+)93LPT44aKXhV<} zG4&qZ3_0%UVcPxR2wGA>ShIq;@-p*|?HudcNuyD@_7nF%bZjIvce7CU`C1Tkd<}8b zD@9oQ^|}O?FTN`H7NqsdNab`6M~lJ9ifZ**A^L5Dh?^=gRE9MBfQWoUDx0U(&gE`J zmgOYmV70cxWMc82i2RpS$DaBH-c9`>-pymu)WhrW3rz$eqG2D@YCSN8q3D>W$5cZ7 z@tG()}&H^?Ge(DX!893*OM zRZOo~mtj%yR5^?LfboFqVYXF&(D2(kdT)-@@vNP6FViL{jT23939EqsTQR%=#cj`h z{ByP12R6{_WzSBPgmFsRuTZqbJ_;}kGFayp0BCA`fSxavItWmlJ}dpW z*qL^0u}nI^*6_;xvoVtQLbO74ROpRpqGt4{!#vqrrUX`232;xdiC)aHl65Y;#1wZV z@-r-mSzZx`#b`)c(?T#(C6%Spe7+Sju7a zL}Pu^n&fh_qL)YkqUY}A*5j>gbO)Q{vv#cD+`cNLETYPk^A~`uRuU_<745k@1>Hdg ztyqq!FfQlmiVdzs+|4+DPW-BVFi+gY8Jn$UjF=(^8A#@y@KqofNmll~0Y9=l-dEzx zi1*z4{MJzy7IugLjVZ7;EOA_Auyey& zbgd!`An6lv+F-4h%y~e_7=9rUceIVGVU1yKyb#lDDhg}^7#1QJ+tLUmZ^Ot`k5nwI zbb3pSV;tHXLb3wb9EZI0+4U~h&K!6|$?CX0i1-XWtax@YwRi_bQ1uj;Tn%n|FRF0Z zcEffzA$}*;q&-$L_a3Fi8C1H9(w##YA3#CbzBG6<0&SlDB@5W;w!h6dRS=t<_D z{MBMYxhU`3gw-eV?yihCHniSJN6(rN)6DG4Kzh{Ch)+oR8gX*>5DQ8Q%1XS0b9$I= zn#9Xlo5<_ z2p0MCu`?RgnpP-8^PctXo2X~>f|Q-U%Gjc5fOT>dy($iE{t9AjnD&!y=&#%`z4G9M z8Z)jocJKJmjlFJGrQ;gB=VGoFouR6U#iOQmnStq(q{!{LK)m`E54D@}Q2>4~^S;~G zVMx)XLF<^IrV;-b32`Ci@j#G^3G5|4eX=ED8}jAT^5m72)H%;Lx(BnKlp^k`NY~dY z-P+U&!So-kDqCHz;v8s$FhcJDrF|HZ7LYd(u~EflCWMzbKlb*kmc=~YrhRstqk_GE zOnO+Dxy&YTlIM7PHqYyuPii@->%kH1@Bpa2E{G_H*T+?v;HxIV>}p8oH^UAdVtxvd z?Z?<|#-Evql0U-vK&P(Zb{y}HC`NPwf1hxbs6k3ce6#kt4cgG!loQy9{iN2cp`{B6 z(##qP<+_TK)8ct4K8}X!`e6t8apkZj{vTZ5KV94ZCCkFFG-WE7ig4&$Ln zv1ZIL<&;OGqc)KQnN-rHu@&EZCtRT{`{K*u+`6uqhvyfuyZza9x+jSAcrRyd~b*=Kkc2mL*ZG>^QC9G|w zTmECavz_FyRvdOn~B0TO9nT8FgqZNADMP*`D_UPHYEEiBI9q*fm)6nE?s(^MTF-t}yK|EvH);jq3rt>6m^-$tMo#2Q zOfjNCdYNUyNcpofv zLwpJkuDa|*#~Yo}O84ZO$I3C7a;NCwh6)dERSj!B^@FodkAWT1YHs1>2r$6@)lEG| zfwB_w@N!N40G`o-+>GN2?ODHF_K7a~j17#kfYOF@8Z_O2v56FIXoMHHtXfU3x-xiW zEwOkr6=O9%YS8t2Xq;kL_~_#InsQ4v3~#f;g}YE_{Sv=C0SOfy0|uR>dasCbkjy@> zk#X_PTN{N>eQxl}MqIgT_P?~%3Vq+%U{Ct7IS%An!wz(<$r5P*Jot;p@ExuSfXDP5 zZ2dPA8@LezqPa94V~B+LaX@Fx8X?=$UqOzq5o5$3O28j$z6YD`2yBF={#XJQj{OmC z`t)DQ*TH^OOIUaK62aJs?B4fU@eCph6K9)K9B&!cmzxv&k*a5|_1gau!w+%vXY zo62;Sr>Z8ATME#E$UdW7dEv&K+_S;wu2hOQ8$d7Fmuh$bb)B_v?EPuQaBQxM_%eoJ zi{!dAC4P_h`KXy*aU3P(y_4$1mK*0XdD#{YfxN&guxaFDcTAy2uviMYe&EXIt>uvI zzGpAhZH(P3373GjE|K$QboARdBLakH!9YNIL<$|6iq#e-Xp6Glz;thOsWnR=V@xP4ySo zuNG=Hu!^+u+=!7u=hpBq*YM-@v1@~h44#LG7H)R4CWE#+1}fH!;)lQRGRMxSTMfNY zVgp6cfPgXQQTfQbxXHazT^+n7*fUzuk-eD%UcM_|;@`3jDckxI4vDl9|lbxS(9gmtsMWkYNz${u=18rUK zh0yHb!SRLY(}R+j!jbyj(v|X0^3lB1yrS9n8k|~$1p*WWJzI8ki!6}S^MQF}7PxJE z={q?*f>E8vq|5l!^7+-I3luJIIAtbP=wOR1!HU$rB3M)uQ4J^DaGkYh8|W0~(Y~%e zUrtb%JLjQcd;7xhW{mk|)_7OlPkT5wQULV!1KcIg5(JlNc=>qyvAqH4tue5H-Q3@Jw|1DVbJ*3N%2k z7LWkYGo<2+$Th_nl1NZZ2~M}Zlftvd0$Ud9tC30jUaigp?3SUL}$PJP8s$(^6J$*y98To@+A>8RHpR_+Cah~C2lGl zayau-;C<(8`=rdYvFi;v@_g!fG3Rq)tUY5SD%5Ws=9_>mt~crijnUxI6S-eO!3by% zro>m_&EYFe=;voS8jojmkvCX0s0MkB_e^Y9FS0SIw4@$ZWGCukeJu~*$PbTT}vEfRA%^z<7b3%rYlWHM~VnqATZo162+TQz?adzq9 za>H$=lfo{KTO_zrOm5{(Q_l0^bBjp{n3)x%J)CeD?*TMCIXR3e9z%RYf@%)hd$0qe z9Z|_#@({e`P;okCZ9;WapRXcDHByJ_l9dcwhkGTm0YgQ+*jMe06RxX)#5gnH^LeX! z``Kpf+}QGN-E#^lYMW_p6xT1i7310x;SY{Q-nnB2c%eJ5de5TvS*x)tN24O;jf-+O zm-0Ax$1qCEvtolRlLBD~c28Op9Cf2@zZeHmxo?elCI50>fk<}s-ORUceCI-`W%#J> zfTAD4jXzU-E0BI)pZLGs)%Z_nM1J1~2lM%%WBWB_;ctQk_7w-#!uA?=J^=mwj<{@+ zOBtY|_SzvBa8TTH$t-&ktMW3y<{S=e?&x03R(WdTZ#Np?g8#Gq-^=$5c~W(!mb7xd$c@;W%^>bQ0z;zQqAh2Gk}(n|~bVB^aP+Dk;Y75rfHOF?<&( zA9&t51Kq_Tn`>-=Ez<&x{Ot4<^c8gA_E!-5k3;z@CXoAq2DSMO2mz0oR@*5BtU45+ z02>E7f!OzceU1Mx8fYK>=NJAX{lcdE1-V(J&mV-kohWKtI#A9RbC{D7E)Nd;Zf53p zoR}QTwZ1=Rz6675B7;mVT4pp}f(@}lsfCnF!dS?U4HutNo?Gu|-GsbE&lds6+kd_l z18#WDaeUFz0NY7YM_X3}cSI)if1@wC2&EYxG&Aiy)VO$Juia&ZB>=R(RgnI}L<1=A zLWy9XoFc!NHHWJ&=2&hEkoQiN$6~820i^NhR}lH223e9~tL(=a4gLE<8R&pub4%9u zj{@NRiL0s8YDA$`AMzt$_r;$Oz<;I&R>gO#*Y^8m0+&SA0~(wQ(ntU^cODt}<3LIf zz+(J;_5OI>zFk09#NV&66%yf%%rcK>HoAUp=U~K5mR!|XqNfk$xelBO#Kws(Dp75et zOii2=BLz67=BbzP;?H?8ji2kybwP>@Q1&AHQ#QZ_@^>mKOjH|SLE-jUt>%EpwFp)a&yA(Wa2xh za1?PCF@OZgdjNog{a^sgN3m!yVki4J^tEKEm2Z5R|J*fwgbOYDIfg^os*{PJZ{pn? z%bZTj8!=biJ|Gk%np*U{B)P`|+$ArG<7H`J-LrCeYj7<*;+61_zN2FDgRbQP)#p%3 zN#qcKK^zF4HaS~T{`BRL)?lp}@4%VdPs%*sDB(!0ie3>{?WhXv^J)#kuN zY4|D-IVdkX6G1@V;*=mj?7vLPfG#Ki!}~Lj6R#jr0I~bbV6xvSAi!_{6as#Dl3PB$ zPn!Vb(_5*DYEH)i!GJpnfM9?j;wG}ejob~{;s!>orFABsLgAe-KV16aI#I|3Io~Zt z*uem@2Hzd;S49HOSOo$~e1dFr2juBb|MhxV{=D8l@9&@U;oot+Rfw_pdXNB?9$Q*Q ztWJ*4g+g14+YVZC>eDdmi^fkH{U>#y;zM8sFLXZ|ZwOE{bY{SJSAi(#y04gztMTD@ zey3NAqKIJ^a0w?~vHbS=z}5!CtZQNA1?+c>kO zNBPTv;Knq0A-hY7?%QMf|Dg{Z08wjR|0hz;|BV~G zq*_uQHkFy2C%;t&wNd5`dU8A?$9j6Ug=uq~C=IOz>fQ!`PX_~-CJj@|1c*-t08-t! zY;q?&(ug2-z(tf=yq09e(9zM}A2n?Df!Gj^uVQ)FL}0&A65HpU`VNX6`3j;WN$C;~ z!O0iZel;X)+Kp)ki951^UiSl1x!`z!xG55dA3WB8q8I|m{5RYug17phSSBQX7V^VT z@W@{Mub^Y8LgZZ_>jZ*M@!o-s5-=0LJ|*1Dj{OCDf2?)hP%fV|R?X#MEgiEFJtau} z6IkXn=6M)7j7SO4iU|ZmS2zIPtTbcHMI89?xkPK(YYmngPP-mMEh8?l<5TxGbJ%xw zua(4=RrCX0hI@AV{}R^WztOw&?{XfBpWHX`ZJMK?PP%(1(SYQKur4VD!!Z%ykeFUt z8kreyd^p6vNJ6|8M6V&>FTA6&GXqqU01VB}aiDE^a2c0x8vW>%&_~z969K~e@OtDP z6BMVl1wDe}07&GC!rO}e_&|abQ48-l@m`{NfBU6_SrgTg%)4%rB1p8&iZq?8%+ZaM zd#S0p+tfRjq)b?gxC+*JDhX*jYN^`4<8duJNi==v{-N5sHb-iD&l~4PHpUgmy{SbZ zc$FN1FnP&IqWGJu*JMUpo;!#isxHv6ICsQ&#{b-C=$5OK0GjUhyOA!zKJO-UkXBpg z{y2iOhbR54P>c0yrH_Wf6aZgA*Y42(43E`{^1}PVfJS{t3Ma639aG7n*U4`G@DkCi z89p&dvfks})&-EFq3|w5wi!?gn+RT^fFDG3VMtGFVx+4FV5ULT^><( zqoB)4-s#}LqKCh)&m=UI4DKfSO!z5FDS%DGKb0m^ShU6Dv6)aA8y_+?Igkg4ffrXB zOeV85r?B_Q^G<15S9g~@w{sMI<%FVJ&~GWDe$>l-#W!|J7=8dz3n`)wEfJ$^aYNqB z_^``-p=@)n35`yYu|m1NVPJWt@|JVji~6*`Vs9D-0${c~;ib~6loJ-vY29!#beWsJ zw_59fJ-d5C_K}!wVY?bnx=`o)2krSH0vLIjt^pc(`99ezDmWmNOb7?C1;79R`Rq*8 zd`l|$bX|3Xpmcl{vDD@ZlS%Wi`V*mb4HjOPTeXl^Td+x%6(nT!KEc%UglSI!S==7M zjO`D9tub$ZFHzLZp(=DToWyi`)5`W$Ad9Ea^xRYI;335zQnIfDu5%)L)y{_?=xdIP zYe8-K!LB;0srNc-Nqznjq|`KH$JcPyH9cLu_I%Ja3ORqM(E|EIY6$cgLKyLRyc8S? zK!p_~rXG(Uk(Zd1b2}E!Oi)aJqjQb9;2-jQJD%Y`q4 z2Fg23GvgDnr5k-o3I_UduxmvXG@55jxiwPx?m8#;1{7T2YEy!E>cgYQ&f|7h4-qU8 zT|k}fB-X4s)>j5A)==u;Xkh$qbf=;qx?MXca_VWUkb3kR_3%QrFEK_A&vEb&C{Tv` z0-j=d>;~r|s#fFEvAInw0Uvj?VLle7Rh%*TXN%PHqUSCTpKhU9`jG9QM?HWkW?7|} z#stBOp>@c>F%GQ@UDbXbXJtcEPJ0FL74mGnkPVc%->2J1(vE%XMuMth{}ZAu#VP( ztr&;re(`*y`gWkWLVj38b4>Udgmskh0~dHIgB{fK2ZNUVPYaJx{$!Z)Z|o$TA}@V% zL-KD4p(TXQc$j=A1GD49ucN6bt8(Jk(e8&Ml9B@PsdI&qp@t4jIRh*4omvvYwO1YDAqI zxyPQKEBD;EhSFKD@HHq1(VbWPn#e{MYE9=7B;8JXxK~hM7f`snk4xPt$KabLysDYpCZ82I#@pUGk=diE z95T;w)!_xn?&kfwV@ByT<@~JDxjWJB7OVSUh6L-vj9FdAk^Hn7`}LAe)IV%izp;Pe z;cUo9!P^NlC^Qy>k0Y@xxfSbQK^#WZGU2NTVnpRGq!oNfZpvn56^B@qJWAVmJ$NT2 z@b&1qsNQsmJyi`ICSzO8fSEvzQ?~`A2v;njIG+iDdT7-CRat10F1>Poi$nSF$EK+Y z|592ngT~fVln=|P8gATX2ThSB$$c0qMOr*W4`-P(?FC0eNhDoHi>sM;>S2U&`FUTU=@VqP5bMlWJDJ zRgG2r&D&3^h+wP@@kH5<9##kAJSC@lL^0FNjwhb6*J-};A(xKwxgsxTlm=69slzHp z6e{*{=z^8g$i1j%Etw!+IN?0tQXKTvB|!1IhQ0Du8MbBK+_83cIYVP(%69yDJB4S@ z-?_-iz;XTr#{+9#&KdACK#Ch@;BnJ{OwnrO;@H$IO-FN3b+qGQUu}n9z@zqs& zE8zCDD{aE7psdI{<@XPio*3;@e&=sM9Udtm` zu}5SMyz4+c_rY$FVg>dO5TT*IgZBbj&bDwCiO(j6-tyv00ujFe_vH$*wbJuBxw#5W zI$4;@E&Ubrw7^&KE2vP_nZ)!OHa32kOyet#KQTFsK0-Xxg?YP`J6u*14=FY`Un`H1 zj7)WFk9qr1^${p=TBh})+isn6kat3pA9UJpEppCtShL81)=_1Zg|e;mCeN9f(1X;W z@HyMI`vVXC!9g{m3-Grss|vW_M#xd}sp1rFeE4M7jvYEhcO_@uu`EC3!_#ehWH2tDatM#$@jgAjbM+;VL#loa;?M8RnPD9hFSF;B}_fUg{#mE zei&*42}q?#uYdl2ZB6Y?0iDQz9~ z9T=JtE%*t1uJOP`W%OM>t=FqcVP>~YZ-=~9wYuo~-so7-4JLuDV1R3U8f!K^!rVnP z#5S_G_bcVGoSZ4E4Ap2gN}W-8tY$`#x5d$tF=+$t7sM(pbr)uIT6x2=gTckE^R+X`xleeK* zz2Hhx`t6DyBJDIuwqHy8(#6Q)a~8^uOfNSDnwgj;P7-*c+1^$UtRN#0w7!ynw-rGY z!_hWXN)Hp2CtBGZPtUKiF!&`7#)WQ7Mf1i!H3(%2hFmYisZH!QKqD2oxtZ~=CJBB> z9pm$=MNXzCUC&vbu@dHUj5;4dFY^-Ini>u->Li|kO)AD_FDdfi=wId3WS-|Q$%@WB zs=B1tAop0`snK)VtCr87UY&`+GVvawgWY{pEJCRk;NWode0_ianDC>-=^)lP20p&j zWJA!%c8BjGc6bLudZx(e83ty?tJIx~wCs8`JYs2XZuyLpGq*Y6xGZlD8;rKv-G0CR ze~l{Zzgq?VpZfgIrhNYmKY%@VU$a-TL)tjdaa&8>`IIsJaoheYbQB=}+K7o1zhz$X zF$^{GGYw!HC~g5EfWtQTF&sUc<%y;4wAoyb_hn_#SWc}vgLZMnQKQ)|VIV=9L!8rx zccl_fe$yIy$rMaJ0Brq@07m679FVgv9rCjTP)x#1K%hV}q$V2( z``~ym5y1MSVbY=aOW)`vl!U>=L*YP3m;S3u0jzsSn-=+DD*4ba85EXY0G_uDTqj_G zkr(4gOn7SYWnFsYmkU6^ayj4RE9kLU-T2l4AkkcFg25*(oDAZywJIx%ycNa|1k*xq zUIW22i1H;mc-l!i$dSe+Qh?idf8585cUcA&$RGbPBh%n{(x^yTN6fbb%Hqz=KWK6G z7kuvj!nITXWGrWx(8b#uX18j_aF1fEMCy`f8x~2_<<$%f5n^ zxV!*d0Sa25sYpx@NdOv0Z@H7O35W)! z6OiOr1F5_7K(a!KW6PL&=PQV$f`+aG^UV^q3JCHATO!9($?rkVU4NeR&)fUwMEY~d z{AnEiw7q}sGJo!;e_+qy=R;zDW-r@Mm@=b{?j)bO_UY2Y-juj_w|sd( z$Qnf^K&F*A1{rSy4)bU*k=XJT;g# zZOOwx+?EOy*VhYyZVpVeD&VO*enED&BX@z68#@%J@6FFa2`k7*kn@awG~jQ$LpC=d zq#dA3YPAZy_t*38{rjIc0|hIL4iIU)o#HRk0dnlp=X)5a1*n!7uoWtS(@(uCkPF{yu^2N$*!!C?A{`Mj7#Z1qp#Zr#<29{!6Ru|3WDK zKa~Rb*^JNWPbLiGeo;;zy>nA)G&y!7rjzyNQpKVLbVnxv(3WultVapZXf-Xx3s9A{ zLH1W6X%@4KLMmEmC3LsPi(ynx)*M1l z?CRx^j{0^HIPuGqtro=PkLbM1+tqmznjZk-HRXKx)TOb&YveFBH3S}W z^NiXN12$RnRXP4$2YjkP@~t;*OmuuguBQve$FnC#_U;?uH*raG#%5^dC2{qPAd}g1 zH+B!IvalA|`a0sPD4kHvNzKTin#ACl_ABnt;_)!wlT+yM>sdJy?_vfYN1d?=q2Ow& zrvnJ6b{|eSkxw0AJ9uI<;vHdjll?R^n~0;0PT+WcYdfy1zJ20p4@{Ol8|QAV7N zUCeQW^V4b9w|gFR%=3^i11-yJf}&>-0kAZj@=P8#W-X@;ON#*2zOW5t%128VDyFJm zET3%XOFyG}L_;{MSmEw-d9+Tk)fs8#ZC!)iDFDUxp|kH2P<{DZaPePh+=)!0@Y_to zVwzLFfbYwlR%N}YM6VzWHUb1Cxh(9siD zi!8LvtHM7SMi*MOkr>(iSSZcyHv)wLp8G($@IqD}2pJhOuafh&fl4CGHJ);LuYu9Tn9!xjCG~gdQGZoPX9Z`7@OLEd4T)&Hkzy zar;FZAc8Ipi_zx4qb1^(@zzkp=Fl$h^mIhN&nD)5sw+{7R8F*cWubf%cY4r`Bz@9y zj?o0o;HP9!*owNun6e7b@m9^xS{|~q;ojjiEkOkmfpLbsdg#1 zCdoswEiFuV0$lmm75mHMk0PcPt3PNdy`*mj_(LiT0U^2Ee~p#w4}jGD*+|;oXIUG1 zeRU`Exx(y+N-|^V52tueL-Ct5d*Gcc{A!-3q9>7JVy`2U*mZWm!}cDZ`pjyS1o3R` z?J~W?E#{~Wt+v*+teCku)g;p+cRctLLzgtp zvbpb+tsokG;Z;~zV`{K>SwNoe%?wlB*Lxh+@oUUiHf*8{oqDw`*a%-ZaUkyjLYV6Uem9(!HkfqPBMR;DPoK|oA= zKKJ^SJGT2_OG&=48#hsO3aoDVvZPe%@a&Lunyut%zN9Uij=ro(0XCMiD$F8(@7E4#|EARK#y(%d#T*iczBJ#(#H7mfK%!7Hs#w9 zz9B3xY2F`cF_w?rgFWfsM?4IkFsqX-IZNQ*Po)l-_R)T0xK>pPv?<`iCosWee&5S| z)pk}m7Ug%3^fxXviF}km#~!@L`2;_cg=F6dg<41QW9D)^U68{7Cn3&lgAveCf9HYD zPLH2DQ!hCUznu5J@AKZriXiTcky#bvb(~^$ucbKYMKOjJZ*vXDh-7%6pudH`uJ7O= zRJ{?m@ETyZfhxy_?XlaP+0-(oRMZPqsQ8kFfxV zI8tMqAa#Crb1p#b|Hz@*Hcl{pt7IG9;&r>V2~kJ}HscK?sZIhbz<$teb{&s7exD_< zb@|pU^ar%lj$%T<>zwIn`d#Ryno%p@%nZL|k?cQToPj--cxa*fcsn5oYu6(#u3K+| zH!GX(#>C-~O|Ng=b7{C`CwNBgbn>x@_ZHD7$yuNp9(alHt zsV=l4VkHD|IM>otvc#Tjs@Nl#u)gj%ZoX;a+SY+o>JE6!dw3-dRrjXjlasT1GvG&P zi!tS9EqZ5%NNHKHTrP>(A@3+No@=a19<2mX?{O`!1O6AHk(;}yIBI?h6OzU9j>pP6 z%kjV|B^fUZ$h{SpHws6XrsiL$1+?W5%&mJRT55$hwIzUQQZi*7`C#+irsPcS_6?(9; z+d9d4HN45PP{Z{=S#KII;;QiIR=5})UasK@UamID&|4G*Ry6mmj%>cJcJYqY!}wbo zEdop%zVPW%t)RNjr4ofq)g%pM((wMc)zAl`Y_k>v8_c{=XD%w+v&>_FMR@nNJMUr& zRP%$Ey+A_J>kSX|1Rdh0Pzk@WPira3ltimSpY~LL2?;JJ%b(4GK1hGK{Q>#`mOg;; zm5YwbcTHd0JDB>~y23XiUT+@9|o*A6F$FIi8q*`URZU;%Z)(ZUi{i%{AiDwhhgTqj6^(YPD^LAe7 zbTSS36G908QJ}BpbEQDAquJer&676(#OjkQ)g8*55Bfb9r)ug-Ns)?_W=e&YOO+if zUpQutH-_o@3I;!1jon5^b>cUL+H6*EalO_uMR8^ zBbvvH+T1GoG1ya3vV@-WiWNcDqoN;x!+v`XmnGhsT;D%}8pE`2CxGVQtt7venWKmS zL?<_OpCT*qaQ6cd#Q2JLLD9X_*^<<9)20C-jgKfDRt!I;C{Ju0HN!${o&CRp=%m!; zl_!(w9o1kZa~yzHsr1v)WP``_a_5xPZV7jxw~wr^aWBo5$&r=ZDTgp%Ttf3*Dq)JV zWg-c3DeGzQ{I8%~GdN}fL4^)NZ@-LrCi^d?-t88QUC+$PpvCy$|s=5QV`Rrsuz46Y|R|b{3 z>uNJhR&4^@b%1$S{v|E?1HE7F`(I@|z5wjKFrj4hzh}myn{)wh^cBRr2INj10ntOP zfiHcy&U*A7hyn&!VpvEN6uzvuY(nf60ukp&T;hf47@c4sul1}WPtjvAGS zk01*wqlM!&Nj#+D8d?YG0UQyAZOTh1+!LnHX4I;fW}s73q|&g!2&YaCWxwJ>*tCgV zCshfw^M*9k-}4@ZTV_wQl^!thz5KF2q31K{04Ydb;*K+*=LIA!_?u%HjolN;EafA& zoeP*?3+mIDVbOKr;&;bC&BW-s`V6!p-!41h9j2Z40S-QZsQHSYd1n||aR1626MwSm zr88L>sr|olF zEsgFfk7|bUwvN4#e_^OAqDE&h+8*D(a69JGf!CZd4()NKnwsLUyQ`6saf8cHI>$D@ z%B?6x^&f1Z&B2B?!p^((Pe~ zSs!22hx;#Xp+l3^S9@k(>R(~np^pF7+y4I|dg4rnYXES+#7yJLI1RB7!%HUwQh0~i5<9#qti<07V9(Fzv3DQAUDVD18TYp)LLr5 zg}ASvM{Y=JdmXDsMh{<&QC)THH=73v3 zLhoxBtvb&2I_GZ@5Z0B^r><^|%m|XS-4vl%wNNrAK4`u{QTUyYRyk|nEpWnln*-|4 z{JA&^Au0if^T3CJW*DZZKmeP%gV~pI*cmX@96 z+cvwnFH-ID64H2SqhlbpRl)0Yj`4hG2zwte#(eSA^+M-sqn|A#(HOua7w0(uWj#7RpLDa^OLM{ zZoEc^F3(hA06CqL)Atw}y5dY95cj#q>9h`t*QdHm(J1=g%18rz82>D2Mc>2VL?x z4y>UTasCH^o)ei47c{?*SeSmsXVH3BC1WDfL+DF1jhFBqvW2Fb+?##I!P@~&@Kzgh z$z&x^rBwpz^|MnYD^hK=!up4r6PbDfbav%8hhG&~XEYglT|_s#B#zz{Q8Rv|vHIp3 zkuOQH)I_k?{2d84cHtVY&Qv+9gZ%KwejU{%+lO-_+2f8UY(wsINbEHvL9WC#FX68>1yNufI@xz9_b+Pd*#0%Z;G@MDs_OW0bj z?-iV$Jj?8;ajjX+F{ul!wy!`>q_Tz`6}8u${k)g7dAWb}2n(}>;Pw}FV(qDSh!!8- zn>U`MDg_gTm%0~Z-)3y`lCkKPLa5q`e5SW&1^+zb__*61L|-@ZPQrU_c<u$DoI`O&Yg1s3i~Ja*teZ&Jr#!=1}o#pU7pj2aP^OR#gI7#jptJy8|1E)!|L0s zgkLyV8VPW{NQnkQE#q*U4eA+=%l8tno_vPUxxiP%T$TT!o%#DheD1ai;OsxKm?zzf z1sLNbDcU@($O>27+q%nB|HHY{qeT6++?3w{ROFq3iu{5tB^0Q(AN^~!9VYOjs*2zb zCrk?yq)Z(kDmb8(m{n#wx!u(-Hv2G)z@98Af^kP%D=>722 z&?h_aYt>rfy|De*b`+uh;VJG2;my}1i0%C`&kD0LA~o^%J#qn`vvsNm-P1k4|`u82<5x? zJ(6rO5!sERC?Q3%P7;zdR0uH@WlN~64Wonz6GACQ_OeW}FBw^rWGAESWzURd46}GI zzwOlToaZ^uInVoa&ig+7fw^bgGxuEgbzR@>^Zk5ezLpO46tcT1R)n>s1Tb|b{I1CS z``>?ocM$m<4scR*Bdt#jc~KJ zo@xj1Ka=l&{`cCZo_}}Sgae{ZvqD6H*Hsdg#LRpC5)KJk`I$2U+e*BMwR?5D_6M7v z*WRPucy7zhFbLUKHjWq{i4s`XgtV_FEQQ>?!bGs|{CctcuFA6E(RWN_jo#DX-uK>! z5H=9plO+}H1`#vJ@pG-SR0z?~%<{&aEkCQ2xTnXt`BC-$JyzAh1~4|EhkKqKGB%iD zPv&|q`-tcoj#4Et*AVO@P}{wgxdbe3U6qsHpy6+aXfHnYd>X4~?3bPKO=4&sE`mZ) zq=|#(2qSnfunZvG#GV{ozJ1r0w**66!P5h=N_;)141_S{@!o>RJB7l>@NK>-KHV+`9zuPQl zw?F)CNbC2iU$ISpk~RN_N;dz?xB1?G^TkA~q*x6p1XZch3-OK{DUXI*MCv&0r9&dJ zx@YC`>U3xN-zoY%wYoZ+U2*lmt)$y{sAnO6r*RM(E3*B8pL&1h3$(n7s5m9&?R)sp{&Iz{Aq(91=NsWrFR`pBjFV?xIjE0HAkM;aL) z0+V=3leuyAFj1{TsGIb7edsY9Q~@M6R>?o@3PXRcyYt2vgbd{M~%I7fARysVvH;2PUF(CW16 z!Psm_q>}e{GuS9LgR|!3D(f2d73Q!=;g5V{`O&w7|1i&7rN z1SfG3`zf#*VMV!Z*_xeBt4|JUSG8-FA2E|@c%?lD$Mu*_9UvBxBjSo zNTJY@AF^@I(Kf{)YpAk3edxS|51-$MKGAK=UnC$*7sB97o8afIHv$;N{!5LFm?or9 zALVp?jDH=vAhRCNHo28@8yQsICA{W6d(+hXN z6EH)j10f@5f>n*UnE1w?xu-8nD~V&v`_E0xxTQphl?ORFEQXBfZC$|^nOHZv* zpm36J6XUB}gZu?LEA_obW_LK3YJHg39{ZRU%`8o7eN=zMGH0J-`t6rAx(tMQwh_Z$lEIXm8&Z@Mlu@tosf^>%}eSD6ZeTwO?h z<)HTX`lyzWm7d{VakefVL$Q{iIFo3^=_vE&mAXW_lg_AR_hi`Tmek%0yUw>&h``wJVj`8`SR&>~K|B_fuN} zJ`6=gVcqK?{!ZR8pn{)|n~C35pfJns;WC2b_a=W?FpHZu?+`I5FE|X{n*jo}e^!a*kt)Ax=@qnZiMVJT(n5BBohjmobqwZGtBsa4&_4Wp6Xe8h*~0tK zHp0Kq4b-qD2b1D4T4E?ck~zj-#KO`^Z7w92YteJLN$S4A=FQ?m{Gp?MHCtv%ubyQZ zs4N*l&gxzohW8zW6Vz*ah@Y&T%3U6;x;&{!6knyKNO5PqZTVbrkeI{G^Wr+v;#|Mg zK)<2AmvGC*iS{><`*Xtgz15y#JG2AO%MkEZuOnnODscJNS=Q%ZhFt@bc6ZS%q+aqi z9ej|Yx_C#GTGw)8;Jn5K;(3e|R_MYh3G{PDJYSFe;NS;yrb z`N^$nd&l0STX$XaSqbj$Z*4&qL+`mL4HA&G1n4Z&2zrY*Vkn2e6GyP-&%0P$-d*=j zT)j+=C;f^(=7C+-2fenh2zIJiEwLMY6}x4Cw!LFX6JFyrz#8W)8)2Gf>8I=e$sxiU z?|eD_t>>xyuMJ1+nE{uI9mSn`jPYSmTn=T1XQS;LRyQTamH1^EW;yfP?0og+)~&Ds zwhK|%R`%f7PjT?XBe!llwe%u=aZ^*MtR`#(9gx8_bo4;pYky)K4p;m7yi zbzO9;eq+kFRYG*gcKPaeSyGOlK+AvMg0AcsmJ?-0!q#C3CG}d&#O}Edm0ZMH#BDKC zGr=cQY7HqBBM9a0M9Go}s~rbV*=;;{=9aa6jgfu*s^4JUEAtWiIzMRLs$P7KwI=RE z0$Xs9E#$JZ^SE`2>JDR-P=iYZiznlsA**|;bb9gjP(j*J3Mqwll9D+pv*gN7k)JmN zlhE69py@)SNCt;w!jxa#JJJ>*EgQkjTU0{GiH4)`udT(c4{}*GuChEyc;~1b-SXVB z;p)ZsuNvxUBJDs2Enb4G+~;H?N6d)Gn)KDm&*?imI2}Hj+249y^t6rAd4X*c?}Sf1 zy|taGLC?31Rp%JL_Fl-wC9R^s5g5NW5&#jFlVp4LE}m78Hasi!sx-21XKBpN9ePm@ zlp+F)^rcxhR9zxs>J>ztu*I&C3|^$u1_Z}Mm1yVOtenQf2aVU&8>G-m60t7@iSG{2 zut5B->t6Tu3a7!crwJiJg^8Xu%a$F7RpRzp>+bA+apimqN51z$R7ADCa_dD+}q$0!;Z zA6^f3Du>$lqP(rdivdqE?qzU1rk68O^$@>@hMN&hCoRM2}1(geM9d zEUl{xE4lcG9l-BC?;~EwG|^?A1bnHWQ&U5kc)_Np zS6#g#v&UQ)R5st}PncSo+cF`}-*HuWZtIj8LGO`6MMin$Be|haKN|y%=a_2_%*U;~ zrDg0R>=a*I`p876eJV8JH)T17+D>Aw#%{TSJw=4wU7X_~=y_I_dwf)J$V?JSxeOtC zE6)Q-3}`5vhp_{7g`T1%GNrasoKJi}FwF~+^6dG%xZvlkt`VrnpoHkU?Hbsx*cNpd zW^aO&V>F=!Q3fRB@YnQAn)U|`_aPUvxmve0;bVIvwFJ+lZii=RbP&TbpnP1@92;D?>TI=_6fBD7$)0KzgfJN9cB zWC7NvL)M{VY3|fL-dCv&S|UZgORfTrRUQM`YM}~G?KdeI`h3`S$13IdjtofO8;#!g zt70YLm9A@$jWptT9aTNP3+U_0*6})78cp*yjMN@4U8%l`h`yf`QV6-hKZRt%U&7oQ zkf1-IZFeSij$Tb28f2s3kKGEOn4O-34)E?g(8XLx_PbxA5;S8{Xx%j;oO%lXbB zg&7Q0i$Kw@H#bQ47D1HwskXeW?65Jo_EO_%obulJ_oxO5$o^xH%@C#qd^k!cozVpY zgxassnKxY=A+-BM-dA;pexG6a)t7XD{etg!56gYx?4a5TRBR$!~ zm}Ak)XUd75NhK^b-lbhjtt|UC?+T+ zoF+s>rLh>QpRl_i;Z`bRE9RR3S%Ec}RdG-_!EgfXwmAlF@1o~oHj2zIDT}Y$-t45( zIi;d#_0hUjLH=dK&X~{BTQ?j!--6uVO0+WVh14r96Eq~~$ zd}cG#{4D4EOn*JZ2R17^M0XzXqU|@oU3H+p#r3(f%H{sLE$l~{r0|!D1)?5pzq+wb zEnja)@ip!U{guB6g>^V&=JY5RD`;MuL8)do`=z%?ZQCcsHc!vnxc|^$6;)H?vt##J zl@}W$0ZX(YU@eRv<}ON~R!Fy??JRd3F7~#ZoRgfl4YGAiFts}`xv`9Qn{-r?vn@HE zvK{b=ZY844C?<3O@nQphcv|sGzk-=T=Xpkpnh{3!-97bU+qrOijm2bWFwha3>&qS* zuNmxPJw@^g)KGQKpk&t=rG4yocFSlvY4u3KWhmMrFJ#Wnp0_}3#_faTMviy%Jeu~1 zf++1eMTj_fiWo7DS>#NVckv%TTwE5}p?Pv?hhLTLu_OEYX9i5~vRKC_*1_7K1j(UN z$_nu`lA_^(nNgUnFMzpF;RF=!rM1p=M&`SFo^!IUgM#mU8laM-c(PrmmaL;cw6YVW z>op7)qCg$nm#BQ391wB&Z!nw(`*z%y*&9@0t8TanLYb~cLK!KxjyAQV_>$I6uU9&O20pzcQ$BIm5lDY$vD}#P7(V86M|lh`%*C& zj4yDlOFS?lk0rrJ(e=4HBfB!6*6+2vl;-K~D2&>4>BGE%%azZ&VqA|@pC3xBKNHzn zjb>At3qMIPazhST$zUr@!7)<`|wQbt>;{VrZd)e=>6o{<7{i zSkc_9cDe<0QS#>SbPDSyi}9kwu|rFjrQyfv%s9~ba-oIwbdOT&U3B5Dk}KpG)Vba- zT{*TfJG4{#<05O_G;Zr0(|^u?;We(}UuUZSTt5Bo_&Ydi_dqWTZVmFL9$+=knXf^P zI6-DyK*w0@$@S*3@9RB(uK)Z$cnn+n(fHJK!xQdNhsDv)!ks;(8ISeXAWu0K)rK?> z7q0K|DgLN-4ajsZ`lK5>{<5#HB0ERhV&oWRB6i>vmnL42V!5HUB(FbI@d z`UHF)5M7EUL!UeR=dV8#XOoIk9Z+`M@xDP~oApOg@l?&puc3RCPG#M2)7dSwQ9L

;l+Akpv85-()cKQE?Wu?h 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 List[np.array]: + return self._encode(queries) + + def __call__(self, texts: List[str]) -> List[np.array]: + return self._encode(texts) + + def encode_documents(self, documents: List[str]) -> List[np.array]: + return self._encode(documents) + + def _encode(self, texts: List[str]): + return [np.array(self.client.embeddings(model=self.model_name, prompt=text)['embedding']) for text in texts] + +class MyVanna(Milvus_VectorStore, Ollama): + def __init__(self, config=None): + fn = OllamaEmbeddingFunction(model_name=config['embedding_model'], host=config['ollama_host']) + milvus = MilvusClient(uri=config['milvus_host']) + config['embedding_function'] = fn + config['milvus_client'] = milvus + Milvus_VectorStore.__init__(self, config=config) + Ollama.__init__(self, config=config) + +vn = MyVanna(config={'ollama_host': 'http://ollama:11434', 'model': 'phi3:3.8b', 'embedding_model': 'phi3:3.8b', 'milvus_host': 'http://milvus:19530'}) +``` + +#### 单张表的场景 + +假定 Hive 中已有一张表,建表语句为 + +```sql +CREATE TABLE IF NOT EXISTS test_table (id bigint, data string); +``` + +在 Notebook 中,我们继续写入以下代码: + +```python +vn.connect_to_hive(host = 'hive-server2-0.hive-server2.kdp-data.svc.cluster.local', + dbname = 'default', + port = 10000, + auth = 'NOSASL', + user = 'root') + +vn.train(ddl='CREATE TABLE IF NOT EXISTS test_table (id bigint, data string)') + +# 提问 +# 你会看到输出类似这样的SQL: +# SELECT id +# FROM minio_test_2 +# ORDER BY data DESC +# LIMIT 3 +# 以及图表展示 +vn.ask("What are the top 3 ids of test_table?") +``` + +#### 多张表的场景 + +Vanna 官方提供了一个 sqlite 数据库示例 [Chinook.sqlite](https://vanna.ai/Chinook.sqlite)。我们将其下载后,在 jupyterlab 中上传到 notebook 同级目录。写入以下代码: + +```python +vn.connect_to_sqlite('Chinook.sqlite') + +# 遍历所有DDL语句来对表结构进行训练 +df_ddl = vn.run_sql("SELECT type, sql FROM sqlite_master WHERE sql is not null") +for ddl in df_ddl['sql'].to_list(): + vn.train(ddl=ddl) + +# 提问 +vn.ask(question="What are the top 10 billing countries by total billing?", allow_llm_to_see_data=True) +``` + +如果你选择使用其他数据库,可以对代码进行调整,针对具体的建表语句进行训练。 + +更多用例请参考[官方文档](https://vanna.ai/docs/)。 diff --git a/docs/zh/user-tutorials/tutorials.md b/docs/zh/user-tutorials/tutorials.md index 4cae11f..37e97ca 100644 --- a/docs/zh/user-tutorials/tutorials.md +++ b/docs/zh/user-tutorials/tutorials.md @@ -19,4 +19,5 @@ * [可视化分析淘宝母婴购物数据](./visualization-analysis-of-taobao's-maternal-and-infant-shopping-data.md) * [如何在KDP上构建一个销售侧的实时数据流水线](./Real-time-incremental-data-analysis.md) * [在KDP上构建数据湖](./iceberg-quickstart.md) + * [在 KDP 上构建 LLM RAG 应用](./llm-rag-guide.md) * 更多...