diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index c405c1f084..2f2d0d2f5e 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -2,7 +2,7 @@
name: Bug report
about: Create a report to help us improve
title: ''
-labels: ''
+labels: 'kind/bug, priority/p2'
assignees: ''
---
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index bbcbbe7d61..d73d644481 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -2,7 +2,7 @@
name: Feature request
about: Suggest an idea for this project
title: ''
-labels: ''
+labels: 'kind/feature'
assignees: ''
---
diff --git a/.github/workflows/lint_pr.yml b/.github/workflows/lint_pr.yml
new file mode 100644
index 0000000000..40c3dead00
--- /dev/null
+++ b/.github/workflows/lint_pr.yml
@@ -0,0 +1,24 @@
+name: lint-pr
+
+on:
+ pull_request_target:
+ types:
+ - opened
+ - edited
+ - synchronize
+
+jobs:
+ validate-title:
+ name: Validate PR title
+ runs-on: ubuntu-latest
+ steps:
+ - uses: amannn/action-semantic-pull-request@v4
+ with:
+ # Must use uppercase
+ subjectPattern: ^(?=[A-Z]).+$
+ subjectPatternError: |
+ The subject "{subject}" found in the pull request title "{title}"
+ didn't match the configured pattern. Please ensure that the subject
+ starts with an uppercase character.
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/master_only.yml b/.github/workflows/master_only.yml
index 42f0383832..8bb4dafa34 100644
--- a/.github/workflows/master_only.yml
+++ b/.github/workflows/master_only.yml
@@ -120,11 +120,20 @@ jobs:
run: pip install pip-tools
- name: Install dependencies
run: make install-python-ci-dependencies
+ - name: Setup Redis Cluster
+ run: |
+ docker pull vishnunair/docker-redis-cluster:latest
+ docker run -d -p 6001:6379 -p 6002:6380 -p 6003:6381 -p 6004:6382 -p 6005:6383 -p 6006:6384 --name redis-cluster vishnunair/docker-redis-cluster
- name: Test python
env:
FEAST_SERVER_DOCKER_IMAGE_TAG: ${{ needs.build-lambda-docker-image.outputs.DOCKER_IMAGE_TAG }}
FEAST_USAGE: "False"
IS_TEST: "True"
+ SNOWFLAKE_CI_DEPLOYMENT: ${{ secrets.SNOWFLAKE_CI_DEPLOYMENT }}
+ SNOWFLAKE_CI_USER: ${{ secrets.SNOWFLAKE_CI_USER }}
+ SNOWFLAKE_CI_PASSWORD: ${{ secrets.SNOWFLAKE_CI_PASSWORD }}
+ SNOWFLAKE_CI_ROLE: ${{ secrets.SNOWFLAKE_CI_ROLE }}
+ SNOWFLAKE_CI_WAREHOUSE: ${{ secrets.SNOWFLAKE_CI_WAREHOUSE }}
run: pytest -n 8 --cov=./ --cov-report=xml --verbose --color=yes sdk/python/tests --integration --durations=5
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v1
@@ -140,6 +149,11 @@ jobs:
FEAST_SERVER_DOCKER_IMAGE_TAG: ${{ needs.build-lambda-docker-image.outputs.DOCKER_IMAGE_TAG }}
FEAST_USAGE: "False"
IS_TEST: "True"
+ SNOWFLAKE_CI_DEPLOYMENT: ${{ secrets.SNOWFLAKE_CI_DEPLOYMENT }}
+ SNOWFLAKE_CI_USER: ${{ secrets.SNOWFLAKE_CI_USER }}
+ SNOWFLAKE_CI_PASSWORD: ${{ secrets.SNOWFLAKE_CI_PASSWORD }}
+ SNOWFLAKE_CI_ROLE: ${{ secrets.SNOWFLAKE_CI_ROLE }}
+ SNOWFLAKE_CI_WAREHOUSE: ${{ secrets.SNOWFLAKE_CI_WAREHOUSE }}
run: pytest --verbose --color=yes sdk/python/tests --integration --benchmark --benchmark-autosave --benchmark-save-data --durations=5
- name: Upload Benchmark Artifact to S3
run: aws s3 cp --recursive .benchmarks s3://feast-ci-pytest-benchmarks
diff --git a/.github/workflows/pr_integration_tests.yml b/.github/workflows/pr_integration_tests.yml
index 8a910f943c..000f9e9728 100644
--- a/.github/workflows/pr_integration_tests.yml
+++ b/.github/workflows/pr_integration_tests.yml
@@ -145,12 +145,21 @@ jobs:
run: pip install pip-tools
- name: Install dependencies
run: make install-python-ci-dependencies
+ - name: Setup Redis Cluster
+ run: |
+ docker pull vishnunair/docker-redis-cluster:latest
+ docker run -d -p 6001:6379 -p 6002:6380 -p 6003:6381 -p 6004:6382 -p 6005:6383 -p 6006:6384 --name redis-cluster vishnunair/docker-redis-cluster
- name: Test python
if: ${{ always() }} # this will guarantee that step won't be canceled and resources won't leak
env:
FEAST_SERVER_DOCKER_IMAGE_TAG: ${{ needs.build-docker-image.outputs.DOCKER_IMAGE_TAG }}
FEAST_USAGE: "False"
IS_TEST: "True"
+ SNOWFLAKE_CI_DEPLOYMENT: ${{ secrets.SNOWFLAKE_CI_DEPLOYMENT }}
+ SNOWFLAKE_CI_USER: ${{ secrets.SNOWFLAKE_CI_USER }}
+ SNOWFLAKE_CI_PASSWORD: ${{ secrets.SNOWFLAKE_CI_PASSWORD }}
+ SNOWFLAKE_CI_ROLE: ${{ secrets.SNOWFLAKE_CI_ROLE }}
+ SNOWFLAKE_CI_WAREHOUSE: ${{ secrets.SNOWFLAKE_CI_WAREHOUSE }}
run: pytest -n 8 --cov=./ --cov-report=xml --verbose --color=yes sdk/python/tests --integration --durations=5
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v1
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 5ff1139acb..f0e5419af7 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -103,7 +103,7 @@ jobs:
runs-on: ubuntu-latest
needs: get-version
env:
- HELM_VERSION: v2.17.0
+ HELM_VERSION: v3.8.0
VERSION_WITHOUT_PREFIX: ${{ needs.get-version.outputs.version_without_prefix }}
steps:
- uses: actions/checkout@v2
@@ -144,5 +144,63 @@ jobs:
python3 setup.py sdist bdist_wheel
python3 -m twine upload --verbose dist/*
- # TODO(adchia): publish java sdk once maven repo is updated
- # See https://github.com/feast-dev/feast-java/blob/master/.github/workflows/release.yml#L104
\ No newline at end of file
+ publish-python-sdk-no-telemetry:
+ runs-on: ubuntu-latest
+ needs: get-version
+ env:
+ TWINE_USERNAME: __token__
+ TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
+ container: python:3.7
+ steps:
+ - uses: actions/checkout@v2
+ - name: Install pip-tools
+ run: pip install pip-tools
+ - name: Install dependencies
+ run: make install-python-ci-dependencies PYTHON=3.7
+ - name: Publish Python Package
+ env:
+ SETUPTOOLS_SCM_PRETEND_VERSION: ${{ needs.get-version.outputs.version_without_prefix }}
+ run: |
+ cd sdk/python
+ sed -i 's/DEFAULT_FEAST_USAGE_VALUE = "True"/DEFAULT_FEAST_USAGE_VALUE = "False"/g' feast/constants.py
+ sed -i 's/NAME = "feast"/NAME = "feast-no-telemetry"/g' setup.py
+ python3 -m pip install --user --upgrade setuptools wheel twine
+ python3 setup.py sdist bdist_wheel
+ python3 -m twine upload --verbose dist/*
+
+ publish-java-sdk:
+ container: maven:3.6-jdk-11
+ runs-on: ubuntu-latest
+ needs: get-version
+ steps:
+ - uses: actions/checkout@v2
+ with:
+ submodules: 'true'
+ - name: Set up JDK 11
+ uses: actions/setup-java@v1
+ with:
+ java-version: '11'
+ java-package: jdk
+ architecture: x64
+ - uses: actions/setup-python@v2
+ with:
+ python-version: '3.7'
+ architecture: 'x64'
+ - uses: actions/cache@v2
+ with:
+ path: ~/.m2/repository
+ key: ${{ runner.os }}-it-maven-${{ hashFiles('**/pom.xml') }}
+ restore-keys: |
+ ${{ runner.os }}-it-maven-
+ - name: Publish java sdk
+ env:
+ VERSION_WITHOUT_PREFIX: ${{ needs.get-version.outputs.version_without_prefix }}
+ GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }}
+ GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
+ MAVEN_SETTINGS: ${{ secrets.MAVEN_SETTINGS }}
+ run: |
+ echo -n "$GPG_PUBLIC_KEY" > /root/public-key
+ echo -n "$GPG_PRIVATE_KEY" > /root/private-key
+ mkdir -p /root/.m2/
+ echo -n "$MAVEN_SETTINGS" > /root/.m2/settings.xml
+ infra/scripts/publish-java-sdk.sh --revision ${VERSION_WITHOUT_PREFIX} --gpg-key-import-dir /root
diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml
index 5de5971703..d9552e175e 100644
--- a/.github/workflows/unit_tests.yml
+++ b/.github/workflows/unit_tests.yml
@@ -42,6 +42,12 @@ jobs:
- name: Install dependencies
run: make install-python-ci-dependencies
- name: Test Python
+ env:
+ SNOWFLAKE_CI_DEPLOYMENT: ${{ secrets.SNOWFLAKE_CI_DEPLOYMENT }}
+ SNOWFLAKE_CI_USER: ${{ secrets.SNOWFLAKE_CI_USER }}
+ SNOWFLAKE_CI_PASSWORD: ${{ secrets.SNOWFLAKE_CI_PASSWORD }}
+ SNOWFLAKE_CI_ROLE: ${{ secrets.SNOWFLAKE_CI_ROLE }}
+ SNOWFLAKE_CI_WAREHOUSE: ${{ secrets.SNOWFLAKE_CI_WAREHOUSE }}
run: FEAST_USAGE=False pytest -n 8 --cov=./ --cov-report=xml --verbose --color=yes sdk/python/tests
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v1
diff --git a/.prow.yaml b/.prow.yaml
index b03a71a475..4c8372cc7c 100644
--- a/.prow.yaml
+++ b/.prow.yaml
@@ -1,102 +1,4 @@
-presubmits:
-- name: test-core-and-ingestion
- decorate: true
- spec:
- containers:
- - image: maven:3.6-jdk-11
- command: ["infra/scripts/test-java-core-ingestion.sh"]
- resources:
- requests:
- cpu: "2000m"
- memory: "1536Mi"
- skip_branches:
- - ^v0\.(3|4)-branch$
-
-- name: test-core-and-ingestion-java-8
- decorate: true
- always_run: true
- spec:
- containers:
- - image: maven:3.6-jdk-8
- command: ["infra/scripts/test-java-core-ingestion.sh"]
- resources:
- requests:
- cpu: "2000m"
- memory: "1536Mi"
- branches:
- - ^v0\.(3|4)-branch$
-
-- name: test-serving
- decorate: true
- spec:
- containers:
- - image: maven:3.6-jdk-11
- command: ["infra/scripts/test-java-serving.sh"]
- skip_branches:
- - ^v0\.(3|4)-branch$
-
-- name: test-serving-java-8
- decorate: true
- always_run: true
- spec:
- containers:
- - image: maven:3.6-jdk-8
- command: ["infra/scripts/test-java-serving.sh"]
- branches:
- - ^v0\.(3|4)-branch$
-
-- name: test-java-sdk
- decorate: true
- spec:
- containers:
- - image: maven:3.6-jdk-11
- command: ["infra/scripts/test-java-sdk.sh"]
- skip_branches:
- - ^v0\.(3|4)-branch$
-
-- name: test-java-sdk-java-8
- decorate: true
- always_run: true
- spec:
- containers:
- - image: maven:3.6-jdk-8
- command: ["infra/scripts/test-java-sdk.sh"]
- branches:
- - ^v0\.(3|4)-branch$
-
-- name: test-golang-sdk
- decorate: true
- spec:
- containers:
- - image: golang:1.13
- command: ["infra/scripts/test-golang-sdk.sh"]
-
postsubmits:
-- name: publish-python-sdk
- decorate: true
- spec:
- containers:
- - image: python:3
- command:
- - sh
- - -c
- - |
- make package-protos && make compile-protos-python && infra/scripts/publish-python-sdk.sh \
- --directory-path sdk/python --repository pypi
- volumeMounts:
- - name: pypirc
- mountPath: /root/.pypirc
- subPath: .pypirc
- readOnly: true
- volumes:
- - name: pypirc
- secret:
- secretName: pypirc
- branches:
- # Filter on tags with semantic versioning, prefixed with "v"
- # https://github.com/semver/semver/issues/232
- - ^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$
-
- name: publish-java-sdk
decorate: true
spec:
@@ -128,31 +30,3 @@ postsubmits:
branches:
# Filter on tags with semantic versioning, prefixed with "v".
- ^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$
-
-- name: publish-java-8-sdk
- decorate: true
- spec:
- containers:
- - image: maven:3.6-jdk-8
- command:
- - bash
- - -c
- - infra/scripts/publish-java-sdk.sh --revision ${PULL_BASE_REF:1}
- volumeMounts:
- - name: gpg-keys
- mountPath: /etc/gpg
- readOnly: true
- - name: maven-settings
- mountPath: /root/.m2/settings.xml
- subPath: settings.xml
- readOnly: true
- volumes:
- - name: gpg-keys
- secret:
- secretName: gpg-keys
- - name: maven-settings
- secret:
- secretName: maven-settings
- branches:
- # Filter on tags with semantic versioning, prefixed with "v". v0.3 and v0.4 only.
- - ^v0\.(3|4)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$
diff --git a/.prow/config.yaml b/.prow/config.yaml
index 3bc2d760a3..e633b2a895 100644
--- a/.prow/config.yaml
+++ b/.prow/config.yaml
@@ -64,6 +64,9 @@ tide:
merge_method:
feast-dev/feast: squash
feast-dev/feast-spark: squash
+ merge_commit_template:
+ feast-dev/feast:
+ title: '{{.Title}}'
blocker_label: merge-blocker
squash_label: tide/squash
diff --git a/.prow/plugins.yaml b/.prow/plugins.yaml
index 0f89e07be5..0dbf0f4c72 100644
--- a/.prow/plugins.yaml
+++ b/.prow/plugins.yaml
@@ -34,6 +34,8 @@ config_updater:
maps:
.prow/config.yaml:
name: config
+ .prow.yaml:
+ name: job-config
external_plugins:
feast-dev/feast:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 53514c5ad0..1aac35ddb4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,106 @@
# Changelog
+## [v0.18.1](https://github.com/feast-dev/feast/tree/v0.18.1) (2022-02-15)
+
+[Full Changelog](https://github.com/feast-dev/feast/compare/v0.18.0...v0.18.1)
+
+**Fixed bugs:**
+
+- ODFVs raise a PerformanceWarning for very large sets of features [\#2293](https://github.com/feast-dev/feast/issues/2293)
+- Don't require `snowflake` to always be installed [\#2309](https://github.com/feast-dev/feast/pull/2309) ([judahrand](https://github.com/judahrand))
+- podAnnotations Values in the feature-server chart [\#2304](https://github.com/feast-dev/feast/pull/2304) ([tpvasconcelos](https://github.com/tpvasconcelos))
+- Fixing the Java helm charts and adding a demo tutorial on how to use them [\#2298](https://github.com/feast-dev/feast/pull/2298) ([adchia](https://github.com/adchia))
+- avoid using transactions on OSS Redis [\#2296](https://github.com/feast-dev/feast/pull/2296) ([DvirDukhan](https://github.com/DvirDukhan))
+- Include infra objects in registry dump and fix Infra's from\_proto [\#2295](https://github.com/feast-dev/feast/pull/2295) ([adchia](https://github.com/adchia))
+- Expose snowflake credentials for unit testing [\#2288](https://github.com/feast-dev/feast/pull/2288) ([sfc-gh-madkins](https://github.com/sfc-gh-madkins))
+- Fix flaky tests \(test\_online\_store\_cleanup & test\_feature\_get\_online\_features\_types\_match\) [\#2276](https://github.com/feast-dev/feast/pull/2276) ([pyalex](https://github.com/pyalex))
+
+**Merged pull requests:**
+
+- Remove old flag warning with the python feature server [\#2300](https://github.com/feast-dev/feast/pull/2300) ([adchia](https://github.com/adchia))
+- Use an OFFLINE schema for Snowflake offline store tests [\#2291](https://github.com/feast-dev/feast/pull/2291) ([sfc-gh-madkins](https://github.com/sfc-gh-madkins))
+- fix typos in markdown files [\#2289](https://github.com/feast-dev/feast/pull/2289) ([charliec443](https://github.com/charliec443))
+- Add -SNAPSHOT suffix to pom.xml version [\#2286](https://github.com/feast-dev/feast/pull/2286) ([tsotnet](https://github.com/tsotnet))
+- Update CONTRIBUTING.md [\#2282](https://github.com/feast-dev/feast/pull/2282) ([adchia](https://github.com/adchia))
+
+## [v0.18.0](https://github.com/feast-dev/feast/tree/v0.18.0) (2022-02-05)
+
+[Full Changelog](https://github.com/feast-dev/feast/compare/v0.17.0...v0.18.0)
+
+**Implemented enhancements:**
+
+- Tutorial on validation of historical features [\#2277](https://github.com/feast-dev/feast/pull/2277) ([pyalex](https://github.com/pyalex))
+- Feast plan clean up [\#2256](https://github.com/feast-dev/feast/pull/2256) ([felixwang9817](https://github.com/felixwang9817))
+- Return `UNIX\_TIMESTAMP` as Python `datetime` [\#2244](https://github.com/feast-dev/feast/pull/2244) ([judahrand](https://github.com/judahrand))
+- Validating historical features against reference dataset with "great expectations" profiler [\#2243](https://github.com/feast-dev/feast/pull/2243) ([pyalex](https://github.com/pyalex))
+- Implement feature\_store.\_apply\_diffs to handle registry and infra diffs [\#2238](https://github.com/feast-dev/feast/pull/2238) ([felixwang9817](https://github.com/felixwang9817))
+- Compare Python objects instead of proto objects [\#2227](https://github.com/feast-dev/feast/pull/2227) ([felixwang9817](https://github.com/felixwang9817))
+- Modify feature\_store.plan to produce an InfraDiff [\#2211](https://github.com/feast-dev/feast/pull/2211) ([felixwang9817](https://github.com/felixwang9817))
+- Implement diff\_infra\_protos method for feast plan [\#2204](https://github.com/feast-dev/feast/pull/2204) ([felixwang9817](https://github.com/felixwang9817))
+- Persisting results of historical retrieval [\#2197](https://github.com/feast-dev/feast/pull/2197) ([pyalex](https://github.com/pyalex))
+- Merge feast-snowflake plugin into main repo with documentation [\#2193](https://github.com/feast-dev/feast/pull/2193) ([sfc-gh-madkins](https://github.com/sfc-gh-madkins))
+- Add InfraDiff class for feast plan [\#2190](https://github.com/feast-dev/feast/pull/2190) ([felixwang9817](https://github.com/felixwang9817))
+- Use FeatureViewProjection instead of FeatureView in ODFV [\#2186](https://github.com/feast-dev/feast/pull/2186) ([judahrand](https://github.com/judahrand))
+
+**Fixed bugs:**
+
+- Set `created\_timestamp` and `last\_updated\_timestamp` fields [\#2266](https://github.com/feast-dev/feast/pull/2266) ([judahrand](https://github.com/judahrand))
+- Use `datetime.utcnow\(\)` to avoid timezone issues [\#2265](https://github.com/feast-dev/feast/pull/2265) ([judahrand](https://github.com/judahrand))
+- Fix Redis key serialization in java feature server [\#2264](https://github.com/feast-dev/feast/pull/2264) ([pyalex](https://github.com/pyalex))
+- modify registry.db s3 object initialization to work in S3 subdirectory with Java Feast Server [\#2259](https://github.com/feast-dev/feast/pull/2259) ([NalinGHub](https://github.com/NalinGHub))
+- Add snowflake environment variables to allow testing on snowflake infra [\#2258](https://github.com/feast-dev/feast/pull/2258) ([sfc-gh-madkins](https://github.com/sfc-gh-madkins))
+- Correct inconsistent dependency [\#2255](https://github.com/feast-dev/feast/pull/2255) ([judahrand](https://github.com/judahrand))
+- Fix for historical field mappings [\#2252](https://github.com/feast-dev/feast/pull/2252) ([michelle-rascati-sp](https://github.com/michelle-rascati-sp))
+- Add backticks to left\_table\_query\_string [\#2250](https://github.com/feast-dev/feast/pull/2250) ([dmille](https://github.com/dmille))
+- Fix inference of BigQuery ARRAY types. [\#2245](https://github.com/feast-dev/feast/pull/2245) ([judahrand](https://github.com/judahrand))
+- Fix Redshift data creator [\#2242](https://github.com/feast-dev/feast/pull/2242) ([felixwang9817](https://github.com/felixwang9817))
+- Delete entity key from Redis only when all attached feature views are gone [\#2240](https://github.com/feast-dev/feast/pull/2240) ([pyalex](https://github.com/pyalex))
+- Tests for transformation service integration in java feature server [\#2236](https://github.com/feast-dev/feast/pull/2236) ([pyalex](https://github.com/pyalex))
+- Feature server helm chart produces invalid YAML [\#2234](https://github.com/feast-dev/feast/pull/2234) ([pyalex](https://github.com/pyalex))
+- Docker build fails for java feature server [\#2230](https://github.com/feast-dev/feast/pull/2230) ([pyalex](https://github.com/pyalex))
+- Fix ValueType.UNIX\_TIMESTAMP conversions [\#2219](https://github.com/feast-dev/feast/pull/2219) ([judahrand](https://github.com/judahrand))
+- Add on demand feature views deletion [\#2203](https://github.com/feast-dev/feast/pull/2203) ([corentinmarek](https://github.com/corentinmarek))
+- Compare only specs in integration tests [\#2200](https://github.com/feast-dev/feast/pull/2200) ([felixwang9817](https://github.com/felixwang9817))
+- Bump log4j-core from 2.17.0 to 2.17.1 in /java [\#2189](https://github.com/feast-dev/feast/pull/2189) ([dependabot[bot]](https://github.com/apps/dependabot))
+- Support multiple application properties files \(incl from classpath\) [\#2187](https://github.com/feast-dev/feast/pull/2187) ([pyalex](https://github.com/pyalex))
+- Avoid requesting features from OnlineStore twice [\#2185](https://github.com/feast-dev/feast/pull/2185) ([judahrand](https://github.com/judahrand))
+- Speed up Datastore deletes by batch deletions with multithreading [\#2182](https://github.com/feast-dev/feast/pull/2182) ([ptoman-pa](https://github.com/ptoman-pa))
+- Fixes large payload runtime exception in Datastore \(issue 1633\) [\#2181](https://github.com/feast-dev/feast/pull/2181) ([ptoman-pa](https://github.com/ptoman-pa))
+
+**Merged pull requests:**
+
+- Add link to community plugin for Spark offline store [\#2279](https://github.com/feast-dev/feast/pull/2279) ([adchia](https://github.com/adchia))
+- Fix broken links on documentation [\#2278](https://github.com/feast-dev/feast/pull/2278) ([adchia](https://github.com/adchia))
+- Publish alternative python package with FEAST\_USAGE=False by default [\#2275](https://github.com/feast-dev/feast/pull/2275) ([pyalex](https://github.com/pyalex))
+- Unify all helm charts versions [\#2274](https://github.com/feast-dev/feast/pull/2274) ([pyalex](https://github.com/pyalex))
+- Fix / update helm chart workflows to push the feast python server [\#2273](https://github.com/feast-dev/feast/pull/2273) ([adchia](https://github.com/adchia))
+- Update Feast Serving documentation with ways to run and debug locally [\#2272](https://github.com/feast-dev/feast/pull/2272) ([adchia](https://github.com/adchia))
+- Fix Snowflake docs [\#2270](https://github.com/feast-dev/feast/pull/2270) ([felixwang9817](https://github.com/felixwang9817))
+- Update local-feature-server.md [\#2269](https://github.com/feast-dev/feast/pull/2269) ([tsotnet](https://github.com/tsotnet))
+- Update docs to include Snowflake/DQM and removing unused docs from old versions of Feast [\#2268](https://github.com/feast-dev/feast/pull/2268) ([adchia](https://github.com/adchia))
+- Graduate Python feature server [\#2263](https://github.com/feast-dev/feast/pull/2263) ([felixwang9817](https://github.com/felixwang9817))
+- Fix benchmark tests at HEAD by passing in Snowflake secrets [\#2262](https://github.com/feast-dev/feast/pull/2262) ([adchia](https://github.com/adchia))
+- Refactor `pa\_to\_feast\_value\_type` [\#2246](https://github.com/feast-dev/feast/pull/2246) ([judahrand](https://github.com/judahrand))
+- Allow using pandas.StringDtype to support on-demand features with STRING type [\#2229](https://github.com/feast-dev/feast/pull/2229) ([pyalex](https://github.com/pyalex))
+- Bump jackson-databind from 2.10.1 to 2.10.5.1 in /java/common [\#2228](https://github.com/feast-dev/feast/pull/2228) ([dependabot[bot]](https://github.com/apps/dependabot))
+- Split apply total parse repo [\#2226](https://github.com/feast-dev/feast/pull/2226) ([mickey-liu](https://github.com/mickey-liu))
+- Publish renamed java packages to maven central \(via Sonatype\) [\#2225](https://github.com/feast-dev/feast/pull/2225) ([pyalex](https://github.com/pyalex))
+- Make online store nullable [\#2224](https://github.com/feast-dev/feast/pull/2224) ([mirayyuce](https://github.com/mirayyuce))
+- Optimize `\_populate\_result\_rows\_from\_feature\_view` [\#2223](https://github.com/feast-dev/feast/pull/2223) ([judahrand](https://github.com/judahrand))
+- Update to newer `redis-py` [\#2221](https://github.com/feast-dev/feast/pull/2221) ([judahrand](https://github.com/judahrand))
+- Adding a local feature server test [\#2217](https://github.com/feast-dev/feast/pull/2217) ([adchia](https://github.com/adchia))
+- replace GetOnlineFeaturesResponse with GetOnlineFeaturesResponseV2 in… [\#2214](https://github.com/feast-dev/feast/pull/2214) ([tsotnet](https://github.com/tsotnet))
+- Updates to click==8.\* [\#2210](https://github.com/feast-dev/feast/pull/2210) ([diogommartins](https://github.com/diogommartins))
+- Bump protobuf-java from 3.12.2 to 3.16.1 in /java [\#2208](https://github.com/feast-dev/feast/pull/2208) ([dependabot[bot]](https://github.com/apps/dependabot))
+- Add default priority for bug reports [\#2207](https://github.com/feast-dev/feast/pull/2207) ([adchia](https://github.com/adchia))
+- Modify issue templates to automatically attach labels [\#2205](https://github.com/feast-dev/feast/pull/2205) ([adchia](https://github.com/adchia))
+- Python FeatureServer optimization [\#2202](https://github.com/feast-dev/feast/pull/2202) ([judahrand](https://github.com/judahrand))
+- Refactor all importer logic to belong in feast.importer [\#2199](https://github.com/feast-dev/feast/pull/2199) ([felixwang9817](https://github.com/felixwang9817))
+- Refactor `OnlineResponse.to\_dict\(\)` [\#2196](https://github.com/feast-dev/feast/pull/2196) ([judahrand](https://github.com/judahrand))
+- \[Java feature server\] Converge ServingService API to make Python and Java feature servers consistent [\#2166](https://github.com/feast-dev/feast/pull/2166) ([pyalex](https://github.com/pyalex))
+- Add a unit test for the tag\_proto\_objects method [\#2163](https://github.com/feast-dev/feast/pull/2163) ([achals](https://github.com/achals))
+
+
## [v0.17.0](https://github.com/feast-dev/feast/tree/v0.17.0) (2021-12-31)
[Full Changelog](https://github.com/feast-dev/feast/compare/v0.16.1...v0.17.0)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 6918d7f1de..62e42d4df0 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,15 +1,29 @@
# Development Guide: Main Feast Repository
> Please see [Development Guide](https://docs.feast.dev/project/development-guide) for project level development instructions.
-### Overview
+## Overview
This guide is targeted at developers looking to contribute to Feast components in
the main Feast repository:
- [Feast Python SDK / CLI](#feast-python-sdk-%2F-cli)
+- [Feast Java Serving](#feast-java-serving)
- [Feast Go Client](#feast-go-client)
-- [Feast Terraform](#feast-terraform)
## Making a pull request
+### Pull request checklist
+A quick list of things to keep in mind as you're making changes:
+- As you make changes
+ - Make your changes in a [forked repo](#forking-the-repo) (instead of making a branch on the main Feast repo)
+ - [Sign your commits](#signing-off-commits) as you go (to avoid DCO checks failing)
+ - [Rebase from master](#incorporating-upstream-changes-from-master) instead of using `git pull` on your PR branch
+ - Install [pre-commit hooks](#pre-commit-hooks) to ensure all the default linters / formatters are run when you push.
+- When you make the PR
+ - Make a pull request from the forked repo you made
+ - Ensure you add a GitHub **label** (i.e. a kind tag to the PR (e.g. `kind/bug` or `kind/housekeeping`)) or else checks will fail.
+ - Ensure you leave a release note for any user facing changes in the PR. There is a field automatically generated in the PR request. You can write `NONE` in that field if there are no user facing changes.
+ - Please run tests locally before submitting a PR (e.g. for Python, the [local integration tests](#local-integration-tests))
+ - Try to keep PRs smaller. This makes them easier to review.
+
### Forking the repo
Fork the Feast Github repo and clone your fork locally. Then make changes to a local branch to the fork.
@@ -26,6 +40,9 @@ pre-commit install --hook-type pre-commit --hook-type pre-push
3. On push, the pre-commit hook will run. This runs `make format` and `make lint`.
### Signing off commits
+> :warning: Warning: using the default integrations with IDEs like VSCode or IntelliJ will not sign commits.
+> When you submit a PR, you'll have to re-sign commits to pass the DCO check.
+
Use git signoffs to sign your commits. See
https://docs.github.com/en/github/authenticating-to-github/managing-commit-signature-verification for details
@@ -50,7 +67,7 @@ Setting up your development environment for Feast Python SDK / CLI:
3. _Recommended:_ Create a virtual environment to isolate development dependencies to be installed
```sh
# create & activate a virtual environment
-python -v venv venv/
+python -m venv venv/
source venv/bin/activate
```
@@ -96,13 +113,27 @@ make test-python
> - Ensure Feast Python SDK / CLI is not configured with configuration overrides (ie `~/.feast/config` should be empty).
### Integration Tests
-To get tests running, you'll need to have GCP / AWS / Redis setup:
+There are two sets of tests you can run:
+1. Local integration tests (for faster development)
+2. Full integration tests (requires cloud environment setups)
+
+#### Local integration tests
+To get local integration tests running, you'll need to have Redis setup:
Redis
1. Install Redis: [Quickstart](https://redis.io/topics/quickstart)
2. Run `redis-server`
-GCP
+Now run `make test-python-universal-local`
+
+#### Full integration tests
+To test across clouds, on top of setting up Redis, you also need GCP / AWS / Snowflake setup.
+
+> Note: you can manually control what tests are run today by inspecting
+> [RepoConfiguration](https://github.com/feast-dev/feast/blob/master/sdk/python/tests/integration/feature_repos/repo_configuration.py)
+> and commenting out tests that are added to `DEFAULT_FULL_REPO_CONFIGS`
+
+**GCP**
1. Install the [Cloud SDK](https://cloud.google.com/sdk/docs/install).
2. Then run login to gcloud:
```
@@ -111,15 +142,19 @@ GCP
```
3. Export `GCLOUD_PROJECT=[your project]` to your .zshrc
-AWS
+**AWS**
1. TODO(adchia): flesh out setting up AWS login (or create helper script)
2. Modify `RedshiftDataSourceCreator` to use your credentials
-Then run `make test-python-integration`. Note that for GCP / AWS, this will create new temporary tables / datasets.
+**Snowflake**
+- See https://signup.snowflake.com/
-## Feast Go Client
-:warning: Feast Go Client will move to its own standalone repository in the future.
+Then run `make test-python-integration`. Note that for Snowflake / GCP / AWS, this will create new temporary tables / datasets.
+
+## Feast Java Serving
+See [Java contributing guide](java/CONTRIBUTING.md)
+## Feast Go Client
### Environment Setup
Setting up your development environment for Feast Go SDK:
@@ -152,14 +187,4 @@ go vet
Unit tests for the Feast Go Client can be run as follows:
```sh
go test
-```
-
-## Feast on Kubernetes
-:warning: Feast Terraform will move to its own standalone repository in the future.
-
-See the deployment guide of the respective cloud providers for how to work with these deployments:
-- [Helm Deployment on Kubernetes](https://docs.feast.dev/feast-on-kubernetes/getting-started/install-feast/kubernetes-with-helm)
-- [Terraform Deployment on Amazon EKS](https://docs.feast.dev/feast-on-kubernetes/getting-started/install-feast/kubernetes-amazon-eks-with-terraform)
-- [Terraform Deployment on Azure AKS](https://docs.feast.dev/feast-on-kubernetes/getting-started/install-feast/kubernetes-azure-aks-with-terraform)
-- [Terraform Deployment on Google Cloud GKE](https://docs.feast.dev/feast-on-kubernetes/getting-started/install-feast/google-cloud-gke-with-terraform)
-- [Kustomize Deployment on IBM Cloud IKS or OpenShift](https://docs.feast.dev/feast-on-kubernetes/getting-started/install-feast/ibm-cloud-iks-with-kustomize)
+```
\ No newline at end of file
diff --git a/README.md b/README.md
index 649bb909fa..ed40cd52cb 100644
--- a/README.md
+++ b/README.md
@@ -23,9 +23,9 @@ Feast is an open source feature store for machine learning. Feast is the fastest
Please see our [documentation](https://docs.feast.dev/) for more information about the project.
## 📐 Architecture
-
+![](docs/assets/feast-marchitecture.png)
-The above architecture is the minimal Feast deployment. Want to run the full Feast on GCP/AWS? Click [here](https://docs.feast.dev/how-to-guides/feast-gcp-aws).
+The above architecture is the minimal Feast deployment. Want to run the full Feast on Snowflake/GCP/AWS? Click [here](https://docs.feast.dev/how-to-guides/feast-snowflake-gcp-aws).
## 🐣 Getting Started
@@ -136,25 +136,27 @@ The list below contains the functionality that contributors are planning to deve
* Want to speak to a Feast contributor? We are more than happy to jump on a call. Please schedule a time using [Calendly](https://calendly.com/d/x2ry-g5bb/meet-with-feast-team).
* **Data Sources**
+ * [x] [Snowflake source](https://docs.feast.dev/reference/data-sources/snowflake)
* [x] [Redshift source](https://docs.feast.dev/reference/data-sources/redshift)
* [x] [BigQuery source](https://docs.feast.dev/reference/data-sources/bigquery)
* [x] [Parquet file source](https://docs.feast.dev/reference/data-sources/file)
* [x] [Synapse source (community plugin)](https://github.com/Azure/feast-azure)
* [x] [Hive (community plugin)](https://github.com/baineng/feast-hive)
* [x] [Postgres (community plugin)](https://github.com/nossrannug/feast-postgres)
- * [x] Kafka source (with [push support into the online store](reference/alpha-stream-ingestion.md))
- * [x] [Snowflake source (community plugin)](https://github.com/sfc-gh-madkins/feast-snowflake)
+ * [x] [Spark (community plugin)](https://github.com/Adyen/feast-spark-offline-store)
+ * [x] Kafka source (with [push support into the online store](https://docs.feast.dev/reference/alpha-stream-ingestion))
* [ ] HTTP source
* **Offline Stores**
+ * [x] [Snowflake](https://docs.feast.dev/reference/offline-stores/snowflake)
* [x] [Redshift](https://docs.feast.dev/reference/offline-stores/redshift)
* [x] [BigQuery](https://docs.feast.dev/reference/offline-stores/bigquery)
* [x] [Synapse (community plugin)](https://github.com/Azure/feast-azure)
* [x] [Hive (community plugin)](https://github.com/baineng/feast-hive)
* [x] [Postgres (community plugin)](https://github.com/nossrannug/feast-postgres)
+ * [x] [Trino (community plugin)](https://github.com/Shopify/feast-trino)
+ * [x] [Spark (community plugin)](https://github.com/Adyen/feast-spark-offline-store)
* [x] [In-memory / Pandas](https://docs.feast.dev/reference/offline-stores/file)
* [x] [Custom offline store support](https://docs.feast.dev/how-to-guides/adding-a-new-offline-store)
- * [x] [Snowflake (community plugin)](https://github.com/sfc-gh-madkins/feast-snowflake)
- * [x] [Trino (communiuty plugin)](https://github.com/Shopify/feast-trino)
* **Online Stores**
* [x] [DynamoDB](https://docs.feast.dev/reference/online-stores/dynamodb)
* [x] [Redis](https://docs.feast.dev/reference/online-stores/redis)
@@ -189,7 +191,7 @@ The list below contains the functionality that contributors are planning to deve
* [ ] Delete API
* [ ] Feature Logging (for training)
* **Data Quality Management (See [RFC](https://docs.google.com/document/d/110F72d4NTv80p35wDSONxhhPBqWRwbZXG4f9mNEMd98/edit))**
- * [ ] Data profiling and validation (Great Expectations) (Planned for Q1 2022)
+ * [x] Data profiling and validation (Great Expectations)
* [ ] Metric production
* [ ] Training-serving skew detection
* [ ] Drift detection
@@ -197,10 +199,10 @@ The list below contains the functionality that contributors are planning to deve
* [x] Python SDK for browsing feature registry
* [x] CLI for browsing feature registry
* [x] Model-centric feature tracking (feature services)
+ * [x] Amundsen integration (see [Feast extractor](https://github.com/amundsen-io/amundsen/blob/main/databuilder/databuilder/extractor/feast_extractor.py))
* [ ] REST API for browsing feature registry
* [ ] Feast Web UI
* [ ] Feature versioning
- * [ ] Amundsen integration
## 🎓 Important Resources
@@ -208,7 +210,7 @@ The list below contains the functionality that contributors are planning to deve
Please refer to the official documentation at [Documentation](https://docs.feast.dev/)
* [Quickstart](https://docs.feast.dev/getting-started/quickstart)
* [Tutorials](https://docs.feast.dev/tutorials/tutorials-overview)
- * [Running Feast with GCP/AWS](https://docs.feast.dev/how-to-guides/feast-gcp-aws)
+ * [Running Feast with Snowflake/GCP/AWS](https://docs.feast.dev/how-to-guides/feast-snowflake-gcp-aws)
* [Change Log](https://github.com/feast-dev/feast/blob/master/CHANGELOG.md)
* [Slack (#Feast)](https://slack.feast.dev/)
diff --git a/docs/README.md b/docs/README.md
index 1a76adbde3..f8b9af3c32 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -4,7 +4,7 @@
Feast (**Fea**ture **St**ore) is an operational data system for managing and serving machine learning features to models in production. Feast is able to serve feature data to models from a low-latency online store (for real-time prediction) or from an offline store (for scale-out batch scoring or model training).
-![](.gitbook/assets/feast-marchitecture-211014.png)
+![](assets/feast-marchitecture.png)
## Problems Feast Solves
@@ -30,7 +30,7 @@ Feast addresses this problem by introducing feature reuse through a centralized
**Feature discovery:** We also aim for Feast to include a first-class user interface for exploring and discovering entities and features.
-**Feature validation:** We additionally aim for Feast to improve support for statistics generation of feature data and subsequent validation of these statistics. Current support is limited.
+**Feature validation:** We additionally aim for Feast to improve support for statistics generation of feature data and subsequent validation of these statistics. Current support is limited.
## What Feast is not
@@ -52,6 +52,6 @@ Explore the following resources to get started with Feast:
* [Concepts](getting-started/concepts/) describes all important Feast API concepts
* [Architecture](getting-started/architecture-and-components/) describes Feast's overall architecture.
* [Tutorials](tutorials/tutorials-overview.md) shows full examples of using Feast in machine learning applications.
-* [Running Feast with GCP/AWS](how-to-guides/feast-gcp-aws/) provides a more in-depth guide to using Feast.
+* [Running Feast with Snowflake/GCP/AWS](how-to-guides/feast-snowflake-gcp-aws/) provides a more in-depth guide to using Feast.
* [Reference](reference/feast-cli-commands.md) contains detailed API and design documents.
* [Contributing](project/contributing.md) contains resources for anyone who wants to contribute to Feast.
diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md
index 987a432ac9..deec3e9eed 100644
--- a/docs/SUMMARY.md
+++ b/docs/SUMMARY.md
@@ -16,10 +16,11 @@
* [Feature service](getting-started/concepts/feature-service.md)
* [Feature retrieval](getting-started/concepts/feature-retrieval.md)
* [Point-in-time joins](getting-started/concepts/point-in-time-joins.md)
+ * [Dataset](getting-started/concepts/dataset.md)
* [Architecture](getting-started/architecture-and-components/README.md)
* [Overview](getting-started/architecture-and-components/overview.md)
* [Feature repository](getting-started/architecture-and-components/feature-repository.md)
- * [Registry](getting-started/architecture-and-components/untitled.md)
+ * [Registry](getting-started/architecture-and-components/registry.md)
* [Offline store](getting-started/architecture-and-components/offline-store.md)
* [Online store](getting-started/architecture-and-components/online-store.md)
* [Provider](getting-started/architecture-and-components/provider.md)
@@ -32,17 +33,20 @@
* [Driver ranking](tutorials/driver-ranking-with-feast.md)
* [Fraud detection on GCP](tutorials/fraud-detection.md)
* [Real-time credit scoring on AWS](tutorials/real-time-credit-scoring-on-aws.md)
+* [Driver stats on Snowflake](tutorials/driver-stats-on-snowflake.md)
+* [Validating historical features with Great Expectations](tutorials/validating-historical-features.md)
## How-to Guides
-* [Running Feast with GCP/AWS](how-to-guides/feast-gcp-aws/README.md)
- * [Install Feast](how-to-guides/feast-gcp-aws/install-feast.md)
- * [Create a feature repository](how-to-guides/feast-gcp-aws/create-a-feature-repository.md)
- * [Deploy a feature store](how-to-guides/feast-gcp-aws/deploy-a-feature-store.md)
- * [Build a training dataset](how-to-guides/feast-gcp-aws/build-a-training-dataset.md)
- * [Load data into the online store](how-to-guides/feast-gcp-aws/load-data-into-the-online-store.md)
- * [Read features from the online store](how-to-guides/feast-gcp-aws/read-features-from-the-online-store.md)
+* [Running Feast with Snowflake/GCP/AWS](how-to-guides/feast-snowflake-gcp-aws/README.md)
+ * [Install Feast](how-to-guides/feast-snowflake-gcp-aws/install-feast.md)
+ * [Create a feature repository](how-to-guides/feast-snowflake-gcp-aws/create-a-feature-repository.md)
+ * [Deploy a feature store](how-to-guides/feast-snowflake-gcp-aws/deploy-a-feature-store.md)
+ * [Build a training dataset](how-to-guides/feast-snowflake-gcp-aws/build-a-training-dataset.md)
+ * [Load data into the online store](how-to-guides/feast-snowflake-gcp-aws/load-data-into-the-online-store.md)
+ * [Read features from the online store](how-to-guides/feast-snowflake-gcp-aws/read-features-from-the-online-store.md)
* [Running Feast in production](how-to-guides/running-feast-in-production.md)
+* [Deploying a Java feature server on Kubernetes](how-to-guides/fetching-java-features-k8s.md)
* [Upgrading from Feast 0.9](https://docs.google.com/document/u/1/d/1AOsr\_baczuARjCpmZgVd8mCqTF4AZ49OEyU4Cn-uTT0/edit)
* [Adding a custom provider](how-to-guides/creating-a-custom-provider.md)
* [Adding a new online store](how-to-guides/adding-support-for-a-new-online-store.md)
@@ -53,10 +57,12 @@
* [Data sources](reference/data-sources/README.md)
* [File](reference/data-sources/file.md)
+ * [Snowflake](reference/data-sources/snowflake.md)
* [BigQuery](reference/data-sources/bigquery.md)
* [Redshift](reference/data-sources/redshift.md)
* [Offline stores](reference/offline-stores/README.md)
* [File](reference/offline-stores/file.md)
+ * [Snowflake](reference/offline-stores/snowflake.md)
* [BigQuery](reference/offline-stores/bigquery.md)
* [Redshift](reference/offline-stores/redshift.md)
* [Online stores](reference/online-stores/README.md)
@@ -71,9 +77,11 @@
* [Feature repository](reference/feature-repository/README.md)
* [feature\_store.yaml](reference/feature-repository/feature-store-yaml.md)
* [.feastignore](reference/feature-repository/feast-ignore.md)
+* [Feature servers](reference/feature-servers/README.md)
+ * [Local feature server](reference/feature-servers/local-feature-server.md)
+* [\[Alpha\] Data quality monitoring](reference/dqm.md)
* [\[Alpha\] On demand feature view](reference/alpha-on-demand-feature-view.md)
* [\[Alpha\] Stream ingestion](reference/alpha-stream-ingestion.md)
-* [\[Alpha\] Local feature server](reference/feature-server.md)
* [\[Alpha\] AWS Lambda feature server](reference/alpha-aws-lambda-feature-server.md)
* [Feast CLI reference](reference/feast-cli-commands.md)
* [Python API reference](http://rtd.feast.dev)
diff --git a/docs/advanced/audit-logging.md b/docs/advanced/audit-logging.md
deleted file mode 100644
index 1870a687bd..0000000000
--- a/docs/advanced/audit-logging.md
+++ /dev/null
@@ -1,132 +0,0 @@
-# Audit Logging
-
-{% hint style="warning" %}
-This page applies to Feast 0.7. The content may be out of date for Feast 0.8+
-{% endhint %}
-
-## Introduction
-
-Feast provides audit logging functionality in order to debug problems and to trace the lineage of events.
-
-## Audit Log Types
-
-Audit Logs produced by Feast come in three favors:
-
-| Audit Log Type | Description |
-| :--- | :--- |
-| Message Audit Log | Logs service calls that can be used to track Feast request handling. Currently only gRPC request/response is supported. Enabling Message Audit Logs can be resource intensive and significantly increase latency, as such is not recommended on Online Serving. |
-| Transition Audit Log | Logs transitions in status in resources managed by Feast \(ie an Ingestion Job becoming RUNNING\). |
-| Action Audit Log | Logs actions performed on a specific resource managed by Feast \(ie an Ingestion Job is aborted\). |
-
-## Configuration
-
-| Audit Log Type | Description |
-| :--- | :--- |
-| Message Audit Log | Enabled when both `feast.logging.audit.enabled` and `feast.logging.audit.messageLogging.enabled` is set to `true` |
-| Transition Audit Log | Enabled when `feast.logging.audit.enabled` is set to `true` |
-| Action Audit Log | Enabled when `feast.logging.audit.enabled` is set to `true` |
-
-## JSON Format
-
-Audit Logs produced by Feast are written to the console similar to normal logs but in a structured, machine parsable JSON. Example of a Message Audit Log JSON entry produced:
-
-```text
-{
- "message": {
- "logType": "FeastAuditLogEntry",
- "kind": "MESSAGE",
- "statusCode": "OK",
- "request": {
- "filter": {
- "project": "dummy",
- }
- },
- "application": "Feast",
- "response": {},
- "method": "ListFeatureTables",
- "identity": "105960238928959148073",
- "service": "CoreService",
- "component": "feast-core",
- "id": "45329ea9-0d48-46c5-b659-4604f6193711",
- "version": "0.10.0-SNAPSHOT"
- },
- "hostname": "feast.core"
- "timestamp": "2020-10-20T04:45:24Z",
- "severity": "INFO",
-}
-```
-
-## Log Entry Schema
-
-Fields common to all Audit Log Types:
-
-| Field | Description |
-| :--- | :--- |
-| `logType` | Log Type. Always set to `FeastAuditLogEntry`. Useful for filtering out Feast audit logs. |
-| `application` | Application. Always set to `Feast`. |
-| `component` | Feast Component producing the Audit Log. Set to `feast-core` for Feast Core and `feast-serving` for Feast Serving. Use to filtering out Audit Logs by component. |
-| `version` | Version of Feast producing this Audit Log. Use to filtering out Audit Logs by version. |
-
-Fields in Message Audit Log Type
-
-| Field | Description |
-| :--- | :--- |
-| `id` | Generated UUID that uniquely identifies the service call. |
-| `service` | Name of the Service that handled the service call. |
-| `method` | Name of the Method that handled the service call. Useful for filtering Audit Logs by method \(ie `ApplyFeatureTable` calls\) |
-| `request` | Full request submitted by client in the service call as JSON. |
-| `response` | Full response returned to client by the service after handling the service call as JSON. |
-| `identity` | Identity of the client making the service call as an user Id. Only set when Authentication is enabled. |
-| `statusCode` | The status code returned by the service handling the service call \(ie `OK` if service call handled without error\). |
-
-Fields in Action Audit Log Type
-
-| Field | Description |
-| :--- | :--- |
-| `action` | Name of the action taken on the resource. |
-| `resource.type` | Type of resource of which the action was taken on \(i.e `FeatureTable`\) |
-| resource.id | Identifier specifying the specific resource of which the action was taken on. |
-
-Fields in Transition Audit Log Type
-
-| Field | Description |
-| :--- | :--- |
-| `status` | The new status that the resource transitioned to |
-| `resource.type` | Type of resource of which the transition occurred \(i.e `FeatureTable`\) |
-| `resource.id` | Identifier specifying the specific resource of which the transition occurred. |
-
-## Log Forwarder
-
-Feast currently only supports forwarding Request/Response \(Message Audit Log Type\) logs to an external fluentD service with `feast.**` Fluentd tag.
-
-### Request/Response Log Example
-
-```text
-{
- "id": "45329ea9-0d48-46c5-b659-4604f6193711",
- "service": "CoreService"
- "status_code": "OK",
- "identity": "105960238928959148073",
- "method": "ListProjects",
- "request": {},
- "response": {
- "projects": [
- "default", "project1", "project2"
- ]
- }
- "release_name": 506.457.14.512
-}
-```
-
-### Configuration
-
-The Fluentd Log Forwarder configured with the with the following configuration options in `application.yml`:
-
-| Settings | Description |
-| :--- | :--- |
-| `feast.logging.audit.messageLogging.destination` | `fluentd` |
-| `feast.logging.audit.messageLogging.fluentdHost` | `localhost` |
-| `feast.logging.audit.messageLogging.fluentdPort` | `24224` |
-
-When using Fluentd as the Log forwarder, a Feast `release_name` can be logged instead of the IP address \(eg. IP of Kubernetes pod deployment\), by setting an environment variable `RELEASE_NAME` when deploying Feast.
-
diff --git a/docs/advanced/metrics.md b/docs/advanced/metrics.md
deleted file mode 100644
index 5ea69f883f..0000000000
--- a/docs/advanced/metrics.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# Metrics
-
-{% hint style="warning" %}
-This page applies to Feast 0.7. The content may be out of date for Feast 0.8+
-{% endhint %}
-
-## Overview
-
-Feast Components export metrics that can provide insight into Feast behavior:
-
-* [Feast Ingestion Jobs can be configured to push metrics into StatsD](metrics.md#pushing-ingestion-metrics-to-statsd)
-* [Prometheus can be configured to scrape metrics from Feast Core and Serving.](metrics.md#exporting-feast-metrics-to-prometheus)
-
-See the [Metrics Reference ](../reference/metrics-reference.md)for documentation on metrics are exported by Feast.
-
-{% hint style="info" %}
-Feast Job Controller currently does not export any metrics on its own. However its `application.yml` is used to configure metrics export for ingestion jobs.
-{% endhint %}
-
-## Pushing Ingestion Metrics to StatsD
-
-### **Feast Ingestion Job**
-
-Feast Ingestion Job can be configured to push Ingestion metrics to a StatsD instance. Metrics export to StatsD for Ingestion Job is configured in Job Controller's `application.yml` under `feast.jobs.metrics`
-
-```yaml
- feast:
- jobs:
- metrics:
- # Enables Statd metrics export if true.
- enabled: true
- type: statsd
- # Host and port of the StatsD instance to export to.
- host: localhost
- port: 9125
-```
-
-{% hint style="info" %}
-If you need Ingestion Metrics in Prometheus or some other metrics backend, use a metrics forwarder to forward Ingestion Metrics from StatsD to the metrics backend of choice. \(ie Use [`prometheus-statsd-exporter`](https://github.com/prometheus/statsd_exporter) to forward metrics to Prometheus\).
-{% endhint %}
-
-## Exporting Feast Metrics to Prometheus
-
-### **Feast Core and Serving**
-
-Feast Core and Serving exports metrics to a Prometheus instance via Prometheus scraping its `/metrics` endpoint. Metrics export to Prometheus for Core and Serving can be configured via their corresponding `application.yml`
-
-```yaml
-server:
- # Configures the port where metrics are exposed via /metrics for Prometheus to scrape.
- port: 8081
-```
-
-[Direct Prometheus](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config) to scrape directly from Core and Serving's `/metrics` endpoint.
-
-## Further Reading
-
-See the [Metrics Reference ](../reference/metrics-reference.md)for documentation on metrics are exported by Feast.
-
diff --git a/docs/advanced/security.md b/docs/advanced/security.md
deleted file mode 100644
index 769260074f..0000000000
--- a/docs/advanced/security.md
+++ /dev/null
@@ -1,480 +0,0 @@
----
-description: 'Secure Feast with SSL/TLS, Authentication and Authorization.'
----
-
-# Security
-
-{% hint style="warning" %}
-This page applies to Feast 0.7. The content may be out of date for Feast 0.8+
-{% endhint %}
-
-### Overview
-
-![Overview of Feast's Security Methods.](../.gitbook/assets/untitled-25-1-%20%282%29%20%282%29%20%282%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%281%29%20%281%29.jpg)
-
-Feast supports the following security methods:
-
-* [SSL/TLS on messaging between Feast Core, Feast Online Serving and Feast SDKs.](security.md#2-ssl-tls)
-* [Authentication to Feast Core and Serving based on Open ID Connect ID tokens.](security.md#3-authentication)
-* [Authorization based on project membership and delegating authorization grants to external Authorization Server.](security.md#4-authorization)
-
-[Important considerations when integrating Authentication/Authorization](security.md#5-authentication-and-authorization).
-
-### **SSL/TLS**
-
-Feast supports SSL/TLS encrypted inter-service communication among Feast Core, Feast Online Serving, and Feast SDKs.
-
-#### Configuring SSL/TLS on Feast Core and Feast Serving
-
-The following properties configure SSL/TLS. These properties are located in their corresponding `application.yml`files:
-
-| Configuration Property | Description |
-| :--- | :--- |
-| `grpc.server.security.enabled` | Enables SSL/TLS functionality if `true` |
-| `grpc.server.security.certificateChain` | Provide the path to certificate chain. |
-| `grpc.server.security.privateKey` | Provide the to private key. |
-
-> Read more on enabling SSL/TLS in the[ gRPC starter docs.](https://yidongnan.github.io/grpc-spring-boot-starter/en/server/security.html#enable-transport-layer-security)
-
-#### Configuring SSL/TLS on Python SDK/CLI
-
-To enable SSL/TLS in the [Feast Python SDK](https://api.docs.feast.dev/python/#feast.client.Client) or [Feast CLI](../getting-started/connect-to-feast/feast-cli.md), set the config options via `feast config`:
-
-| Configuration Option | Description |
-| :--- | :--- |
-| `core_enable_ssl` | Enables SSL/TLS functionality on connections to Feast core if `true` |
-| `serving_enable_ssl` | Enables SSL/TLS functionality on connections to Feast Online Serving if `true` |
-| `core_server_ssl_cert` | Optional. Specifies the path of the root certificate used to verify Core Service's identity. If omitted, uses system certificates. |
-| `serving_server_ssl_cert` | Optional. Specifies the path of the root certificate used to verify Serving Service's identity. If omitted, uses system certificates. |
-
-{% hint style="info" %}
-The Python SDK automatically uses SSL/TLS when connecting to Feast Core and Feast Online Serving via port 443.
-{% endhint %}
-
-#### Configuring SSL/TLS on Go SDK
-
-Configure SSL/TLS on the [Go SDK](https://godoc.org/github.com/feast-dev/feast/sdk/go) by passing configuration via `SecurityConfig`:
-
-```go
-cli, err := feast.NewSecureGrpcClient("localhost", 6566, feast.SecurityConfig{
- EnableTLS: true,
- TLSCertPath: "/path/to/cert.pem",
-})Option
-```
-
-| Config Option | Description |
-| :--- | :--- |
-| `EnableTLS` | Enables SSL/TLS functionality when connecting to Feast if `true` |
-| `TLSCertPath` | Optional. Provides the path of the root certificate used to verify Feast Service's identity. If omitted, uses system certificates. |
-
-#### Configuring SSL/TLS on **Java** SDK
-
-Configure SSL/TLS on the [Feast Java SDK](https://javadoc.io/doc/dev.feast/feast-sdk) by passing configuration via `SecurityConfig`:
-
-```java
-FeastClient client = FeastClient.createSecure("localhost", 6566,
- SecurityConfig.newBuilder()
- .setTLSEnabled(true)
- .setCertificatePath(Optional.of("/path/to/cert.pem"))
- .build());
-```
-
-| Config Option | Description |
-| :--- | :--- |
-| `setTLSEnabled()` | Enables SSL/TLS functionality when connecting to Feast if `true` |
-| `setCertificatesPath()` | Optional. Set the path of the root certificate used to verify Feast Service's identity. If omitted, uses system certificates. |
-
-### **Authentication**
-
-{% hint style="warning" %}
-To prevent man in the middle attacks, we recommend that SSL/TLS be implemented prior to authentication.
-{% endhint %}
-
-Authentication can be implemented to identify and validate client requests to Feast Core and Feast Online Serving. Currently, Feast uses[ ](https://auth0.com/docs/protocols/openid-connect-protocol)[Open ID Connect \(OIDC\)](https://auth0.com/docs/protocols/openid-connect-protocol) ID tokens \(i.e. [Google Open ID Connect](https://developers.google.com/identity/protocols/oauth2/openid-connect)\) to authenticate client requests.
-
-#### Configuring Authentication in Feast Core and Feast Online Serving
-
-Authentication can be configured for Feast Core and Feast Online Serving via properties in their corresponding `application.yml` files:
-
-| Configuration Property | Description |
-| :--- | :--- |
-| `feast.security.authentication.enabled` | Enables Authentication functionality if `true` |
-| `feast.security.authentication.provider` | Authentication Provider type. Currently only supports `jwt` |
-| `feast.security.authentication.option.jwkEndpointURI` | HTTPS URL used by Feast to retrieved the [JWK](https://tools.ietf.org/html/rfc7517) used to verify OIDC ID tokens. |
-
-{% hint style="info" %}
-`jwkEndpointURI`is set to retrieve Google's OIDC JWK by default, allowing OIDC ID tokens issued by Google to be used for authentication.
-{% endhint %}
-
-Behind the scenes, Feast Core and Feast Online Serving authenticate by:
-
-* Extracting the OIDC ID token `TOKEN`from gRPC metadata submitted with request:
-
-```text
-('authorization', 'Bearer: TOKEN')
-```
-
-* Validates token's authenticity using the JWK retrieved from the `jwkEndpointURI`
-
-#### **Authenticating Serving with Feast Core**
-
-Feast Online Serving communicates with Feast Core during normal operation. When both authentication and authorization are enabled on Feast Core, Feast Online Serving is forced to authenticate its requests to Feast Core. Otherwise, Feast Online Serving produces an Authentication failure error when connecting to Feast Core.
-
- Properties used to configure Serving authentication via `application.yml`:
-
-| Configuration Property | Description |
-| :--- | :--- |
-| `feast.core-authentication.enabled` | Requires Feast Online Serving to authenticate when communicating with Feast Core. |
-| `feast.core-authentication.provider` | Selects provider Feast Online Serving uses to retrieve credentials then used to authenticate requests to Feast Core. Valid providers are `google` and `oauth`. |
-
-{% tabs %}
-{% tab title="Google Provider" %}
-Google Provider automatically extracts the credential from the credential JSON file.
-
-* Set [`GOOGLE_APPLICATION_CREDENTIALS` environment variable](https://cloud.google.com/docs/authentication/getting-started#setting_the_environment_variable) to the path of the credential in the JSON file.
-{% endtab %}
-
-{% tab title="OAuth Provider" %}
-OAuth Provider makes an OAuth [client credentials](https://auth0.com/docs/flows/call-your-api-using-the-client-credentials-flow) request to obtain the credential. OAuth requires the following options to be set at `feast.security.core-authentication.options.`:
-
-
-
-
-
Configuration Property
-
Description
-
-
-
-
-
oauth_url
-
-
Target URL receiving the client-credentials request.
-
-
-
grant_type
-
-
OAuth grant type. Set as client_credentials
-
-
-
-
client_id
-
-
Client Id used in the client-credentials request.
-
-
-
client_secret
-
-
Client secret used in the client-credentials request.
-
-
-
audience
-
-
-
Target audience of the credential. Set to host URL of Feast Core.
-
(i.e. https://localhost if Feast Core listens on localhost).
-
-
-
-
jwkEndpointURI
-
-
HTTPS URL used to retrieve a JWK that can be used to decode the credential.
-
-
-
-{% endtab %}
-{% endtabs %}
-
-#### **Enabling Authentication in Python SDK/CLI**
-
-Configure the [Feast Python SDK](https://api.docs.feast.dev/python/) and [Feast CLI](../getting-started/connect-to-feast/feast-cli.md) to use authentication via `feast config`:
-
-```python
-$ feast config set enable_auth true
-```
-
-| Configuration Option | Description |
-| :--- | :--- |
-| `enable_auth` | Enables authentication functionality if set to `true`. |
-| `auth_provider` | Use an authentication provider to obtain a credential for authentication. Currently supports `google` and `oauth`. |
-| `auth_token` | Manually specify a static token for use in authentication. Overrules `auth_provider` if both are set. |
-
-{% tabs %}
-{% tab title="Google Provider" %}
-Google Provider automatically finds and uses Google Credentials to authenticate requests:
-
-* Google Provider automatically uses established credentials for authenticating requests if you are already authenticated with the `gcloud` CLI via:
-
-```text
-$ gcloud auth application-default login
-```
-
-* Alternatively Google Provider can be configured to use the credentials in the JSON file via`GOOGLE_APPLICATION_CREDENTIALS` environmental variable \([Google Cloud Authentication documentation](https://cloud.google.com/docs/authentication/getting-started)\):
-
-```bash
-$ export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
-```
-{% endtab %}
-
-{% tab title="OAuth Provider" %}
-OAuth Provider makes an OAuth [client credentials](https://auth0.com/docs/flows/call-your-api-using-the-client-credentials-flow) request to obtain the credential/token used to authenticate Feast requests. The OAuth provider requires the following config options to be set via `feast config`:
-
-
-
-
-
Configuration Property
-
Description
-
-
-
-
-
oauth_token_request_url
-
-
Target URL receiving the client-credentials request.
-
-
-
oauth_grant_type
-
-
OAuth grant type. Set as client_credentials
-
-
-
-
oauth_client_id
-
-
Client Id used in the client-credentials request.
-
-
-
oauth_client_secret
-
-
Client secret used in the client-credentials request.
-
-
-
oauth_audience
-
-
-
Target audience of the credential. Set to host URL of target Service.
-
(https://localhost if Service listens on localhost).
-
-
-
-
-{% endtab %}
-{% endtabs %}
-
-#### **Enabling Authentication in Go SDK**
-
-Configure the [Feast Java SDK](https://javadoc.io/doc/dev.feast/feast-sdk/latest/com/gojek/feast/package-summary.html) to use authentication by specifying the credential via `SecurityConfig`:
-
-```go
-// error handling omitted.
-// Use Google Credential as provider.
-cred, _ := feast.NewGoogleCredential("localhost:6566")
-cli, _ := feast.NewSecureGrpcClient("localhost", 6566, feast.SecurityConfig{
- // Specify the credential to provide tokens for Feast Authentication.
- Credential: cred,
-})
-```
-
-{% tabs %}
-{% tab title="Google Credential" %}
-Google Credential uses Service Account credentials JSON file set via`GOOGLE_APPLICATION_CREDENTIALS` environmental variable \([Google Cloud Authentication documentation](https://cloud.google.com/docs/authentication/getting-started)\) to obtain tokens for Authenticating Feast requests:
-
-* Exporting `GOOGLE_APPLICATION_CREDENTIALS`
-
-```bash
-$ export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
-```
-
-* Create a Google Credential with target audience.
-
-```go
-cred, _ := feast.NewGoogleCredential("localhost:6566")
-```
-
-> Target audience of the credential should be set to host URL of target Service. \(ie `https://localhost` if Service listens on `localhost`\):
-{% endtab %}
-
-{% tab title="OAuth Credential" %}
-OAuth Credential makes an OAuth [client credentials](https://auth0.com/docs/flows/call-your-api-using-the-client-credentials-flow) request to obtain the credential/token used to authenticate Feast requests:
-
-* Create OAuth Credential with parameters:
-
-```go
-cred := feast.NewOAuthCredential("localhost:6566", "client_id", "secret", "https://oauth.endpoint/auth")
-```
-
-
-
-
-
Parameter
-
Description
-
-
-
-
-
audience
-
-
-
Target audience of the credential. Set to host URL of target Service.
-
( https://localhost if Service listens on localhost).
-
-
-
-
clientId
-
-
Client Id used in the client-credentials request.
-
-
-
clientSecret
-
-
Client secret used in the client-credentials request.
-
-
-
endpointURL
-
-
Target URL to make the client-credentials request to.
-
-
-
-{% endtab %}
-{% endtabs %}
-
-#### **Enabling Authentication in Java SDK**
-
-Configure the [Feast Java SDK](https://javadoc.io/doc/dev.feast/feast-sdk/latest/com/gojek/feast/package-summary.html) to use authentication by setting credentials via `SecurityConfig`:
-
-```java
-// Use GoogleAuthCredential as provider.
-CallCredentials credentials = new GoogleAuthCredentials(
- Map.of("audience", "localhost:6566"));
-
-FeastClient client = FeastClient.createSecure("localhost", 6566,
- SecurityConfig.newBuilder()
- // Specify the credentials to provide tokens for Feast Authentication.
- .setCredentials(Optional.of(creds))
- .build());
-```
-
-{% tabs %}
-{% tab title="GoogleAuthCredentials" %}
-GoogleAuthCredentials uses Service Account credentials JSON file set via`GOOGLE_APPLICATION_CREDENTIALS` environmental variable \([Google Cloud authentication documentation](https://cloud.google.com/docs/authentication/getting-started)\) to obtain tokens for Authenticating Feast requests:
-
-* Exporting `GOOGLE_APPLICATION_CREDENTIALS`
-
-```bash
-$ export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
-```
-
-* Create a Google Credential with target audience.
-
-```java
-CallCredentials credentials = new GoogleAuthCredentials(
- Map.of("audience", "localhost:6566"));
-```
-
-> Target audience of the credentials should be set to host URL of target Service. \(ie `https://localhost` if Service listens on `localhost`\):
-{% endtab %}
-
-{% tab title="OAuthCredentials" %}
-OAuthCredentials makes an OAuth [client credentials](https://auth0.com/docs/flows/call-your-api-using-the-client-credentials-flow) request to obtain the credential/token used to authenticate Feast requests:
-
-* Create OAuthCredentials with parameters:
-
-```java
-CallCredentials credentials = new OAuthCredentials(Map.of(
- "audience": "localhost:6566",
- "grant_type", "client_credentials",
- "client_id", "some_id",
- "client_id", "secret",
- "oauth_url", "https://oauth.endpoint/auth",
- "jwkEndpointURI", "https://jwk.endpoint/jwk"));
-```
-
-
-
-
-
Parameter
-
Description
-
-
-
-
-
audience
-
-
-
Target audience of the credential. Set to host URL of target Service.
-
( https://localhost if Service listens on localhost).
-
-
-
-
grant_type
-
-
OAuth grant type. Set as client_credentials
-
-
-
-
client_id
-
-
Client Id used in the client-credentials request.
-
-
-
client_secret
-
-
Client secret used in the client-credentials request.
-
-
-
oauth_url
-
-
Target URL to make the client-credentials request to obtain credential.
-
-
-
jwkEndpointURI
-
-
HTTPS URL used to retrieve a JWK that can be used to decode the credential.
-
-
-
-{% endtab %}
-{% endtabs %}
-
-### Authorization
-
-{% hint style="info" %}
-Authorization requires that authentication be configured to obtain a user identity for use in authorizing requests.
-{% endhint %}
-
-Authorization provides access control to FeatureTables and/or Features based on project membership. Users who are members of a project are authorized to:
-
-* Create and/or Update a Feature Table in the Project.
-* Retrieve Feature Values for Features in that Project.
-
-#### **Authorization API/Server**
-
-![Feast Authorization Flow](../.gitbook/assets/rsz_untitled23%20%282%29%20%282%29%20%282%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29.jpg)
-
-Feast delegates Authorization grants to an external Authorization Server that implements the [Authorization Open API specification](https://github.com/feast-dev/feast/blob/master/common/src/main/resources/api.yaml).
-
-* Feast checks whether a user is authorized to make a request by making a `checkAccessRequest` to the Authorization Server.
-* The Authorization Server should return a `AuthorizationResult` with whether the user is allowed to make the request.
-
-Authorization can be configured for Feast Core and Feast Online Serving via properties in their corresponding `application.yml`
-
-| Configuration Property | Description |
-| :--- | :--- |
-| `feast.security.authorization.enabled` | Enables authorization functionality if `true`. |
-| `feast.security.authorization.provider` | Authentication Provider type. Currently only supports `http` |
-| `feast.security.authorization.option.authorizationUrl` | URL endpoint of Authorization Server to make check access requests to. |
-| `feast.security.authorization.option.subjectClaim` | Optional. Name of the claim of the to extract from the ID Token to include in the check access request as Subject. |
-
-{% hint style="info" %}
-This example of the [Authorization Server with Keto](https://github.com/feast-dev/feast-keto-auth-server) can be used as a reference implementation for implementing an Authorization Server that Feast supports.
-{% endhint %}
-
-### **Authentication & Authorization**
-
-When using Authentication & Authorization, consider:
-
-* Enabling Authentication without Authorization makes authentication **optional**. You can still send unauthenticated requests.
-* Enabling Authorization forces all requests to be authenticated. Requests that are not authenticated are **dropped.**
-
-
-
diff --git a/docs/advanced/troubleshooting.md b/docs/advanced/troubleshooting.md
deleted file mode 100644
index 1060466d30..0000000000
--- a/docs/advanced/troubleshooting.md
+++ /dev/null
@@ -1,136 +0,0 @@
-# Troubleshooting
-
-{% hint style="warning" %}
-This page applies to Feast 0.7. The content may be out of date for Feast 0.8+
-{% endhint %}
-
-If at any point in time you cannot resolve a problem, please see the [Community](../community.md) section for reaching out to the Feast community.
-
-### How can I verify that all services are operational?
-
-#### Docker Compose
-
-The containers should be in an `up` state:
-
-```text
-docker ps
-```
-
-#### Google Kubernetes Engine
-
-All services should either be in a `RUNNING` state or `COMPLETED`state:
-
-```text
-kubectl get pods
-```
-
-### How can I verify that I can connect to all services?
-
-First locate the the host and port of the Feast Services.
-
-#### **Docker Compose \(from inside the docker network\)**
-
-You will probably need to connect using the hostnames of services and standard Feast ports:
-
-```bash
-export FEAST_CORE_URL=core:6565
-export FEAST_ONLINE_SERVING_URL=online_serving:6566
-export FEAST_HISTORICAL_SERVING_URL=historical_serving:6567
-export FEAST_JOBCONTROLLER_URL=jobcontroller:6570
-```
-
-#### **Docker Compose \(from outside the docker network\)**
-
-You will probably need to connect using `localhost` and standard ports:
-
-```bash
-export FEAST_CORE_URL=localhost:6565
-export FEAST_ONLINE_SERVING_URL=localhost:6566
-export FEAST_HISTORICAL_SERVING_URL=localhost:6567
-export FEAST_JOBCONTROLLER_URL=localhost:6570
-```
-
-#### **Google Kubernetes Engine \(GKE\)**
-
-You will need to find the external IP of one of the nodes as well as the NodePorts. Please make sure that your firewall is open for these ports:
-
-```bash
-export FEAST_IP=$(kubectl describe nodes | grep ExternalIP | awk '{print $2}' | head -n 1)
-export FEAST_CORE_URL=${FEAST_IP}:32090
-export FEAST_ONLINE_SERVING_URL=${FEAST_IP}:32091
-export FEAST_HISTORICAL_SERVING_URL=${FEAST_IP}:32092
-```
-
-`netcat`, `telnet`, or even `curl` can be used to test whether all services are available and ports are open, but `grpc_cli` is the most powerful. It can be installed from [here](https://github.com/grpc/grpc/blob/master/doc/command_line_tool.md).
-
-#### Testing Connectivity From Feast Services:
-
-Use `grpc_cli` to test connetivity by listing the gRPC methods exposed by Feast services:
-
-```bash
-grpc_cli ls ${FEAST_CORE_URL} feast.core.CoreService
-```
-
-```bash
-grpc_cli ls ${FEAST_JOBCONTROLLER_URL} feast.core.JobControllerService
-```
-
-```bash
-grpc_cli ls ${FEAST_HISTORICAL_SERVING_URL} feast.serving.ServingService
-```
-
-```bash
-grpc_cli ls ${FEAST_ONLINE_SERVING_URL} feast.serving.ServingService
-```
-
-### How can I print logs from the Feast Services?
-
-Feast will typically have three services that you need to monitor if something goes wrong.
-
-* Feast Core
-* Feast Job Controller
-* Feast Serving \(Online\)
-* Feast Serving \(Batch\)
-
-In order to print the logs from these services, please run the commands below.
-
-#### Docker Compose
-
-Use `docker-compose logs` to obtain Feast component logs:
-
-```text
- docker logs -f feast_core_1
-```
-
-```text
- docker logs -f feast_jobcontroller_1
-```
-
-```text
-docker logs -f feast_historical_serving_1
-```
-
-```text
-docker logs -f feast_online_serving_1
-```
-
-#### Google Kubernetes Engine
-
-Use `kubectl logs` to obtain Feast component logs:
-
-```text
-kubectl logs $(kubectl get pods | grep feast-core | awk '{print $1}')
-```
-
-```text
-kubectl logs $(kubectl get pods | grep feast-jobcontroller | awk '{print $1}')
-```
-
-```text
-kubectl logs $(kubectl get pods | grep feast-serving-batch | awk '{print $1}')
-```
-
-```text
-kubectl logs $(kubectl get pods | grep feast-serving-online | awk '{print $1}')
-```
-
diff --git a/docs/advanced/upgrading.md b/docs/advanced/upgrading.md
deleted file mode 100644
index 3c7b95d544..0000000000
--- a/docs/advanced/upgrading.md
+++ /dev/null
@@ -1,113 +0,0 @@
-# Upgrading Feast
-
-### Migration from v0.6 to v0.7
-
-#### Feast Core Validation changes
-
-In v0.7, Feast Core no longer accepts starting with number \(0-9\) and using dash in names for:
-
-* Project
-* Feature Set
-* Entities
-* Features
-
-Migrate all project, feature sets, entities, feature names:
-
-* with ‘-’ by recreating them with '-' replace with '\_'
-* recreate any names with a number \(0-9\) as the first letter to one without.
-
-Feast now prevents feature sets from being applied if no store is subscribed to that Feature Set.
-
-* Ensure that a store is configured to subscribe to the Feature Set before applying the Feature Set.
-
-#### Feast Core's Job Coordinator is now Feast Job Controller
-
-In v0.7, Feast Core's Job Coordinator has been decoupled from Feast Core and runs as a separate Feast Job Controller application. See its [Configuration reference](../reference/configuration-reference.md#2-feast-core-serving-and-job-controller) for how to configure Feast Job Controller.
-
-**Ingestion Job API**
-
-In v0.7, the following changes are made to the Ingestion Job API:
-
-* Changed List Ingestion Job API to return list of `FeatureSetReference` instead of list of FeatureSet in response.
-* Moved `ListIngestionJobs`, `StopIngestionJob`, `RestartIngestionJob` calls from `CoreService` to `JobControllerService`.
-* Python SDK/CLI: Added new [Job Controller client ](https://github.com/feast-dev/feast/blob/master/sdk/python/feast/contrib/job_controller/client.py)and `jobcontroller_url` config option.
-
-Users of the Ingestion Job API via gRPC should migrate by:
-
-* Add new client to connect to Job Controller endpoint to call `JobControllerService` and call `ListIngestionJobs`, `StopIngestionJob`, `RestartIngestionJob` from new client.
-* Migrate code to accept feature references instead of feature sets returned in `ListIngestionJobs` response.
-
-Users of Ingestion Job via Python SDK \(ie `feast ingest-jobs list` or `client.stop_ingest_job()` etc.\) should migrate by:
-
-* `ingest_job()`methods only: Create a new separate [Job Controller client](https://github.com/feast-dev/feast/blob/master/sdk/python/feast/contrib/job_controller/client.py) to connect to the job controller and call `ingest_job()` methods using the new client.
-* Configure the Feast Job Controller endpoint url via `jobcontroller_url` config option.
-
-#### Configuration Properties Changes
-
-* Rename `feast.jobs.consolidate-jobs-per-source property` to `feast.jobs.controller.consolidate-jobs-per-sources`
-* Rename`feast.security.authorization.options.subjectClaim` to `feast.security.authentication.options.subjectClaim`
-* Rename `feast.logging.audit.messageLoggingEnabled` to `feast.audit.messageLogging.enabled`
-
-### Migration from v0.5 to v0.6
-
-#### Database schema
-
-In Release 0.6 we introduced [Flyway](https://flywaydb.org/) to handle schema migrations in PostgreSQL. Flyway is integrated into `core` and for now on all migrations will be run automatically on `core` start. It uses table `flyway_schema_history` in the same database \(also created automatically\) to keep track of already applied migrations. So no specific maintenance should be needed.
-
-If you already have existing deployment of feast 0.5 - Flyway will detect existing tables and omit first baseline migration.
-
-After `core` started you should have `flyway_schema_history` look like this
-
-```text
->> select version, description, script, checksum from flyway_schema_history
-
-version | description | script | checksum
---------+-----------------------------------------+-----------------------------------------+------------
- 1 | << Flyway Baseline >> | << Flyway Baseline >> |
- 2 | RELEASE 0.6 Generalizing Source AND ... | V2__RELEASE_0.6_Generalizing_Source_... | 1537500232
-```
-
-In this release next major schema changes were done:
-
-* Source is not shared between FeatureSets anymore. It's changed to 1:1 relation
-
- and source's primary key is now auto-incremented number.
-
-* Due to generalization of Source `sources.topics` & `sources.bootstrap_servers` columns were deprecated.
-
- They will be replaced with `sources.config`. Data migration handled by code when respected Source is used.
-
- `topics` and `bootstrap_servers` will be deleted in the next release.
-
-* Job \(table `jobs`\) is no longer connected to `Source` \(table `sources`\) since it uses consolidated source for optimization purposes.
-
- All data required by Job would be embedded in its table.
-
-New Models \(tables\):
-
-* feature\_statistics
-
-Minor changes:
-
-* FeatureSet has new column version \(see [proto](https://github.com/feast-dev/feast/blob/master/protos/feast/core/FeatureSet.proto) for details\)
-* Connecting table `jobs_feature_sets` in many-to-many relation between jobs & feature sets
-
- has now `version` and `delivery_status`.
-
-### Migration from v0.4 to v0.6
-
-#### Database
-
-For all versions earlier than 0.5 seamless migration is not feasible due to earlier breaking changes and creation of new database will be required.
-
-Since database will be empty - first \(baseline\) migration would be applied:
-
-```text
->> select version, description, script, checksum from flyway_schema_history
-
-version | description | script | checksum
---------+-----------------------------------------+-----------------------------------------+------------
- 1 | Baseline | V1__Baseline.sql | 1091472110
- 2 | RELEASE 0.6 Generalizing Source AND ... | V2__RELEASE_0.6_Generalizing_Source_... | 1537500232
-```
-
diff --git a/docs/architecture.md b/docs/architecture.md
deleted file mode 100644
index a2dc5cd6a8..0000000000
--- a/docs/architecture.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Architecture
-
diff --git a/docs/architecture.png b/docs/architecture.png
deleted file mode 100644
index 6d56a62360..0000000000
Binary files a/docs/architecture.png and /dev/null differ
diff --git a/docs/assets/arch.png b/docs/assets/arch.png
deleted file mode 100644
index bc655b60f3..0000000000
Binary files a/docs/assets/arch.png and /dev/null differ
diff --git a/docs/assets/feast-components-overview.png b/docs/assets/feast-components-overview.png
deleted file mode 100644
index 1f69bb7ed8..0000000000
Binary files a/docs/assets/feast-components-overview.png and /dev/null differ
diff --git a/docs/assets/feast-marchitecture.png b/docs/assets/feast-marchitecture.png
new file mode 100644
index 0000000000..0a7b044b09
Binary files /dev/null and b/docs/assets/feast-marchitecture.png differ
diff --git a/docs/assets/statistics-sources (1).png b/docs/assets/statistics-sources (1).png
deleted file mode 100644
index 02be233968..0000000000
Binary files a/docs/assets/statistics-sources (1).png and /dev/null differ
diff --git a/docs/assets/statistics-sources (2).png b/docs/assets/statistics-sources (2).png
deleted file mode 100644
index 02be233968..0000000000
Binary files a/docs/assets/statistics-sources (2).png and /dev/null differ
diff --git a/docs/assets/statistics-sources (3).png b/docs/assets/statistics-sources (3).png
deleted file mode 100644
index 02be233968..0000000000
Binary files a/docs/assets/statistics-sources (3).png and /dev/null differ
diff --git a/docs/assets/statistics-sources (4).png b/docs/assets/statistics-sources (4).png
deleted file mode 100644
index 02be233968..0000000000
Binary files a/docs/assets/statistics-sources (4).png and /dev/null differ
diff --git a/docs/assets/statistics-sources.png b/docs/assets/statistics-sources.png
deleted file mode 100644
index 02be233968..0000000000
Binary files a/docs/assets/statistics-sources.png and /dev/null differ
diff --git a/docs/build-a-training-dataset.md b/docs/build-a-training-dataset.md
deleted file mode 100644
index eff44fdf9c..0000000000
--- a/docs/build-a-training-dataset.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Build a training dataset
-
diff --git a/docs/create-a-feature-repository.md b/docs/create-a-feature-repository.md
deleted file mode 100644
index 5f781f0651..0000000000
--- a/docs/create-a-feature-repository.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Create a feature repository
-
diff --git a/docs/deploy-a-feature-store.md b/docs/deploy-a-feature-store.md
deleted file mode 100644
index 0447b0ffbf..0000000000
--- a/docs/deploy-a-feature-store.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Deploy a feature store
-
diff --git a/docs/docs/.gitbook/assets/basic-architecture-diagram.svg b/docs/docs/.gitbook/assets/basic-architecture-diagram.svg
deleted file mode 100644
index b707f49046..0000000000
--- a/docs/docs/.gitbook/assets/basic-architecture-diagram.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/docs/docs/.gitbook/assets/feast-docs-overview-diagram-2.svg b/docs/docs/.gitbook/assets/feast-docs-overview-diagram-2.svg
deleted file mode 100644
index 7f30963ec7..0000000000
--- a/docs/docs/.gitbook/assets/feast-docs-overview-diagram-2.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/docs/entities.md b/docs/entities.md
deleted file mode 100644
index dadeac1cac..0000000000
--- a/docs/entities.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Entities
-
diff --git a/docs/feast-on-kubernetes/advanced-1/README.md b/docs/feast-on-kubernetes/advanced-1/README.md
deleted file mode 100644
index 0fb91367c2..0000000000
--- a/docs/feast-on-kubernetes/advanced-1/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Advanced
-
diff --git a/docs/feast-on-kubernetes/advanced-1/audit-logging.md b/docs/feast-on-kubernetes/advanced-1/audit-logging.md
deleted file mode 100644
index 1870a687bd..0000000000
--- a/docs/feast-on-kubernetes/advanced-1/audit-logging.md
+++ /dev/null
@@ -1,132 +0,0 @@
-# Audit Logging
-
-{% hint style="warning" %}
-This page applies to Feast 0.7. The content may be out of date for Feast 0.8+
-{% endhint %}
-
-## Introduction
-
-Feast provides audit logging functionality in order to debug problems and to trace the lineage of events.
-
-## Audit Log Types
-
-Audit Logs produced by Feast come in three favors:
-
-| Audit Log Type | Description |
-| :--- | :--- |
-| Message Audit Log | Logs service calls that can be used to track Feast request handling. Currently only gRPC request/response is supported. Enabling Message Audit Logs can be resource intensive and significantly increase latency, as such is not recommended on Online Serving. |
-| Transition Audit Log | Logs transitions in status in resources managed by Feast \(ie an Ingestion Job becoming RUNNING\). |
-| Action Audit Log | Logs actions performed on a specific resource managed by Feast \(ie an Ingestion Job is aborted\). |
-
-## Configuration
-
-| Audit Log Type | Description |
-| :--- | :--- |
-| Message Audit Log | Enabled when both `feast.logging.audit.enabled` and `feast.logging.audit.messageLogging.enabled` is set to `true` |
-| Transition Audit Log | Enabled when `feast.logging.audit.enabled` is set to `true` |
-| Action Audit Log | Enabled when `feast.logging.audit.enabled` is set to `true` |
-
-## JSON Format
-
-Audit Logs produced by Feast are written to the console similar to normal logs but in a structured, machine parsable JSON. Example of a Message Audit Log JSON entry produced:
-
-```text
-{
- "message": {
- "logType": "FeastAuditLogEntry",
- "kind": "MESSAGE",
- "statusCode": "OK",
- "request": {
- "filter": {
- "project": "dummy",
- }
- },
- "application": "Feast",
- "response": {},
- "method": "ListFeatureTables",
- "identity": "105960238928959148073",
- "service": "CoreService",
- "component": "feast-core",
- "id": "45329ea9-0d48-46c5-b659-4604f6193711",
- "version": "0.10.0-SNAPSHOT"
- },
- "hostname": "feast.core"
- "timestamp": "2020-10-20T04:45:24Z",
- "severity": "INFO",
-}
-```
-
-## Log Entry Schema
-
-Fields common to all Audit Log Types:
-
-| Field | Description |
-| :--- | :--- |
-| `logType` | Log Type. Always set to `FeastAuditLogEntry`. Useful for filtering out Feast audit logs. |
-| `application` | Application. Always set to `Feast`. |
-| `component` | Feast Component producing the Audit Log. Set to `feast-core` for Feast Core and `feast-serving` for Feast Serving. Use to filtering out Audit Logs by component. |
-| `version` | Version of Feast producing this Audit Log. Use to filtering out Audit Logs by version. |
-
-Fields in Message Audit Log Type
-
-| Field | Description |
-| :--- | :--- |
-| `id` | Generated UUID that uniquely identifies the service call. |
-| `service` | Name of the Service that handled the service call. |
-| `method` | Name of the Method that handled the service call. Useful for filtering Audit Logs by method \(ie `ApplyFeatureTable` calls\) |
-| `request` | Full request submitted by client in the service call as JSON. |
-| `response` | Full response returned to client by the service after handling the service call as JSON. |
-| `identity` | Identity of the client making the service call as an user Id. Only set when Authentication is enabled. |
-| `statusCode` | The status code returned by the service handling the service call \(ie `OK` if service call handled without error\). |
-
-Fields in Action Audit Log Type
-
-| Field | Description |
-| :--- | :--- |
-| `action` | Name of the action taken on the resource. |
-| `resource.type` | Type of resource of which the action was taken on \(i.e `FeatureTable`\) |
-| resource.id | Identifier specifying the specific resource of which the action was taken on. |
-
-Fields in Transition Audit Log Type
-
-| Field | Description |
-| :--- | :--- |
-| `status` | The new status that the resource transitioned to |
-| `resource.type` | Type of resource of which the transition occurred \(i.e `FeatureTable`\) |
-| `resource.id` | Identifier specifying the specific resource of which the transition occurred. |
-
-## Log Forwarder
-
-Feast currently only supports forwarding Request/Response \(Message Audit Log Type\) logs to an external fluentD service with `feast.**` Fluentd tag.
-
-### Request/Response Log Example
-
-```text
-{
- "id": "45329ea9-0d48-46c5-b659-4604f6193711",
- "service": "CoreService"
- "status_code": "OK",
- "identity": "105960238928959148073",
- "method": "ListProjects",
- "request": {},
- "response": {
- "projects": [
- "default", "project1", "project2"
- ]
- }
- "release_name": 506.457.14.512
-}
-```
-
-### Configuration
-
-The Fluentd Log Forwarder configured with the with the following configuration options in `application.yml`:
-
-| Settings | Description |
-| :--- | :--- |
-| `feast.logging.audit.messageLogging.destination` | `fluentd` |
-| `feast.logging.audit.messageLogging.fluentdHost` | `localhost` |
-| `feast.logging.audit.messageLogging.fluentdPort` | `24224` |
-
-When using Fluentd as the Log forwarder, a Feast `release_name` can be logged instead of the IP address \(eg. IP of Kubernetes pod deployment\), by setting an environment variable `RELEASE_NAME` when deploying Feast.
-
diff --git a/docs/feast-on-kubernetes/advanced-1/metrics.md b/docs/feast-on-kubernetes/advanced-1/metrics.md
deleted file mode 100644
index 43f7b973b6..0000000000
--- a/docs/feast-on-kubernetes/advanced-1/metrics.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# Metrics
-
-{% hint style="warning" %}
-This page applies to Feast 0.7. The content may be out of date for Feast 0.8+
-{% endhint %}
-
-## Overview
-
-Feast Components export metrics that can provide insight into Feast behavior:
-
-* [Feast Ingestion Jobs can be configured to push metrics into StatsD](metrics.md#pushing-ingestion-metrics-to-statsd)
-* [Prometheus can be configured to scrape metrics from Feast Core and Serving.](metrics.md#exporting-feast-metrics-to-prometheus)
-
-See the [Metrics Reference ](../reference-1/metrics-reference.md)for documentation on metrics are exported by Feast.
-
-{% hint style="info" %}
-Feast Job Controller currently does not export any metrics on its own. However its `application.yml` is used to configure metrics export for ingestion jobs.
-{% endhint %}
-
-## Pushing Ingestion Metrics to StatsD
-
-### **Feast Ingestion Job**
-
-Feast Ingestion Job can be configured to push Ingestion metrics to a StatsD instance. Metrics export to StatsD for Ingestion Job is configured in Job Controller's `application.yml` under `feast.jobs.metrics`
-
-```yaml
- feast:
- jobs:
- metrics:
- # Enables Statd metrics export if true.
- enabled: true
- type: statsd
- # Host and port of the StatsD instance to export to.
- host: localhost
- port: 9125
-```
-
-{% hint style="info" %}
-If you need Ingestion Metrics in Prometheus or some other metrics backend, use a metrics forwarder to forward Ingestion Metrics from StatsD to the metrics backend of choice. \(ie Use [`prometheus-statsd-exporter`](https://github.com/prometheus/statsd_exporter) to forward metrics to Prometheus\).
-{% endhint %}
-
-## Exporting Feast Metrics to Prometheus
-
-### **Feast Core and Serving**
-
-Feast Core and Serving exports metrics to a Prometheus instance via Prometheus scraping its `/metrics` endpoint. Metrics export to Prometheus for Core and Serving can be configured via their corresponding `application.yml`
-
-```yaml
-server:
- # Configures the port where metrics are exposed via /metrics for Prometheus to scrape.
- port: 8081
-```
-
-[Direct Prometheus](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config) to scrape directly from Core and Serving's `/metrics` endpoint.
-
-## Further Reading
-
-See the [Metrics Reference ](../reference-1/metrics-reference.md)for documentation on metrics are exported by Feast.
-
diff --git a/docs/feast-on-kubernetes/advanced-1/security.md b/docs/feast-on-kubernetes/advanced-1/security.md
deleted file mode 100644
index b6e42afd73..0000000000
--- a/docs/feast-on-kubernetes/advanced-1/security.md
+++ /dev/null
@@ -1,480 +0,0 @@
----
-description: 'Secure Feast with SSL/TLS, Authentication and Authorization.'
----
-
-# Security
-
-{% hint style="warning" %}
-This page applies to Feast 0.7. The content may be out of date for Feast 0.8+
-{% endhint %}
-
-### Overview
-
-![Overview of Feast's Security Methods.](../../.gitbook/assets/untitled-25-1-%20%282%29%20%282%29%20%282%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%281%29%20%284%29.jpg)
-
-Feast supports the following security methods:
-
-* [SSL/TLS on messaging between Feast Core, Feast Online Serving and Feast SDKs.](security.md#2-ssl-tls)
-* [Authentication to Feast Core and Serving based on Open ID Connect ID tokens.](security.md#3-authentication)
-* [Authorization based on project membership and delegating authorization grants to external Authorization Server.](security.md#4-authorization)
-
-[Important considerations when integrating Authentication/Authorization](security.md#5-authentication-and-authorization).
-
-### **SSL/TLS**
-
-Feast supports SSL/TLS encrypted inter-service communication among Feast Core, Feast Online Serving, and Feast SDKs.
-
-#### Configuring SSL/TLS on Feast Core and Feast Serving
-
-The following properties configure SSL/TLS. These properties are located in their corresponding `application.yml`files:
-
-| Configuration Property | Description |
-| :--- | :--- |
-| `grpc.server.security.enabled` | Enables SSL/TLS functionality if `true` |
-| `grpc.server.security.certificateChain` | Provide the path to certificate chain. |
-| `grpc.server.security.privateKey` | Provide the to private key. |
-
-> Read more on enabling SSL/TLS in the[ gRPC starter docs.](https://yidongnan.github.io/grpc-spring-boot-starter/en/server/security.html#enable-transport-layer-security)
-
-#### Configuring SSL/TLS on Python SDK/CLI
-
-To enable SSL/TLS in the [Feast Python SDK](https://api.docs.feast.dev/python/#feast.client.Client) or [Feast CLI](../getting-started/connect-to-feast/feast-cli.md), set the config options via `feast config`:
-
-| Configuration Option | Description |
-| :--- | :--- |
-| `core_enable_ssl` | Enables SSL/TLS functionality on connections to Feast core if `true` |
-| `serving_enable_ssl` | Enables SSL/TLS functionality on connections to Feast Online Serving if `true` |
-| `core_server_ssl_cert` | Optional. Specifies the path of the root certificate used to verify Core Service's identity. If omitted, uses system certificates. |
-| `serving_server_ssl_cert` | Optional. Specifies the path of the root certificate used to verify Serving Service's identity. If omitted, uses system certificates. |
-
-{% hint style="info" %}
-The Python SDK automatically uses SSL/TLS when connecting to Feast Core and Feast Online Serving via port 443.
-{% endhint %}
-
-#### Configuring SSL/TLS on Go SDK
-
-Configure SSL/TLS on the [Go SDK](https://godoc.org/github.com/feast-dev/feast/sdk/go) by passing configuration via `SecurityConfig`:
-
-```go
-cli, err := feast.NewSecureGrpcClient("localhost", 6566, feast.SecurityConfig{
- EnableTLS: true,
- TLSCertPath: "/path/to/cert.pem",
-})Option
-```
-
-| Config Option | Description |
-| :--- | :--- |
-| `EnableTLS` | Enables SSL/TLS functionality when connecting to Feast if `true` |
-| `TLSCertPath` | Optional. Provides the path of the root certificate used to verify Feast Service's identity. If omitted, uses system certificates. |
-
-#### Configuring SSL/TLS on **Java** SDK
-
-Configure SSL/TLS on the [Feast Java SDK](https://javadoc.io/doc/dev.feast/feast-sdk) by passing configuration via `SecurityConfig`:
-
-```java
-FeastClient client = FeastClient.createSecure("localhost", 6566,
- SecurityConfig.newBuilder()
- .setTLSEnabled(true)
- .setCertificatePath(Optional.of("/path/to/cert.pem"))
- .build());
-```
-
-| Config Option | Description |
-| :--- | :--- |
-| `setTLSEnabled()` | Enables SSL/TLS functionality when connecting to Feast if `true` |
-| `setCertificatesPath()` | Optional. Set the path of the root certificate used to verify Feast Service's identity. If omitted, uses system certificates. |
-
-### **Authentication**
-
-{% hint style="warning" %}
-To prevent man in the middle attacks, we recommend that SSL/TLS be implemented prior to authentication.
-{% endhint %}
-
-Authentication can be implemented to identify and validate client requests to Feast Core and Feast Online Serving. Currently, Feast uses[ ](https://auth0.com/docs/protocols/openid-connect-protocol)[Open ID Connect \(OIDC\)](https://auth0.com/docs/protocols/openid-connect-protocol) ID tokens \(i.e. [Google Open ID Connect](https://developers.google.com/identity/protocols/oauth2/openid-connect)\) to authenticate client requests.
-
-#### Configuring Authentication in Feast Core and Feast Online Serving
-
-Authentication can be configured for Feast Core and Feast Online Serving via properties in their corresponding `application.yml` files:
-
-| Configuration Property | Description |
-| :--- | :--- |
-| `feast.security.authentication.enabled` | Enables Authentication functionality if `true` |
-| `feast.security.authentication.provider` | Authentication Provider type. Currently only supports `jwt` |
-| `feast.security.authentication.option.jwkEndpointURI` | HTTPS URL used by Feast to retrieved the [JWK](https://tools.ietf.org/html/rfc7517) used to verify OIDC ID tokens. |
-
-{% hint style="info" %}
-`jwkEndpointURI`is set to retrieve Google's OIDC JWK by default, allowing OIDC ID tokens issued by Google to be used for authentication.
-{% endhint %}
-
-Behind the scenes, Feast Core and Feast Online Serving authenticate by:
-
-* Extracting the OIDC ID token `TOKEN`from gRPC metadata submitted with request:
-
-```text
-('authorization', 'Bearer: TOKEN')
-```
-
-* Validates token's authenticity using the JWK retrieved from the `jwkEndpointURI`
-
-#### **Authenticating Serving with Feast Core**
-
-Feast Online Serving communicates with Feast Core during normal operation. When both authentication and authorization are enabled on Feast Core, Feast Online Serving is forced to authenticate its requests to Feast Core. Otherwise, Feast Online Serving produces an Authentication failure error when connecting to Feast Core.
-
- Properties used to configure Serving authentication via `application.yml`:
-
-| Configuration Property | Description |
-| :--- | :--- |
-| `feast.core-authentication.enabled` | Requires Feast Online Serving to authenticate when communicating with Feast Core. |
-| `feast.core-authentication.provider` | Selects provider Feast Online Serving uses to retrieve credentials then used to authenticate requests to Feast Core. Valid providers are `google` and `oauth`. |
-
-{% tabs %}
-{% tab title="Google Provider" %}
-Google Provider automatically extracts the credential from the credential JSON file.
-
-* Set [`GOOGLE_APPLICATION_CREDENTIALS` environment variable](https://cloud.google.com/docs/authentication/getting-started#setting_the_environment_variable) to the path of the credential in the JSON file.
-{% endtab %}
-
-{% tab title="OAuth Provider" %}
-OAuth Provider makes an OAuth [client credentials](https://auth0.com/docs/flows/call-your-api-using-the-client-credentials-flow) request to obtain the credential. OAuth requires the following options to be set at `feast.security.core-authentication.options.`:
-
-
-
-
-
Configuration Property
-
Description
-
-
-
-
-
oauth_url
-
-
Target URL receiving the client-credentials request.
-
-
-
grant_type
-
-
OAuth grant type. Set as client_credentials
-
-
-
-
client_id
-
-
Client Id used in the client-credentials request.
-
-
-
client_secret
-
-
Client secret used in the client-credentials request.
-
-
-
audience
-
-
-
Target audience of the credential. Set to host URL of Feast Core.
-
(i.e. https://localhost if Feast Core listens on localhost).
-
-
-
-
jwkEndpointURI
-
-
HTTPS URL used to retrieve a JWK that can be used to decode the credential.
-
-
-
-{% endtab %}
-{% endtabs %}
-
-#### **Enabling Authentication in Python SDK/CLI**
-
-Configure the [Feast Python SDK](https://api.docs.feast.dev/python/) and [Feast CLI](../getting-started/connect-to-feast/feast-cli.md) to use authentication via `feast config`:
-
-```python
-$ feast config set enable_auth true
-```
-
-| Configuration Option | Description |
-| :--- | :--- |
-| `enable_auth` | Enables authentication functionality if set to `true`. |
-| `auth_provider` | Use an authentication provider to obtain a credential for authentication. Currently supports `google` and `oauth`. |
-| `auth_token` | Manually specify a static token for use in authentication. Overrules `auth_provider` if both are set. |
-
-{% tabs %}
-{% tab title="Google Provider" %}
-Google Provider automatically finds and uses Google Credentials to authenticate requests:
-
-* Google Provider automatically uses established credentials for authenticating requests if you are already authenticated with the `gcloud` CLI via:
-
-```text
-$ gcloud auth application-default login
-```
-
-* Alternatively Google Provider can be configured to use the credentials in the JSON file via`GOOGLE_APPLICATION_CREDENTIALS` environmental variable \([Google Cloud Authentication documentation](https://cloud.google.com/docs/authentication/getting-started)\):
-
-```bash
-$ export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
-```
-{% endtab %}
-
-{% tab title="OAuth Provider" %}
-OAuth Provider makes an OAuth [client credentials](https://auth0.com/docs/flows/call-your-api-using-the-client-credentials-flow) request to obtain the credential/token used to authenticate Feast requests. The OAuth provider requires the following config options to be set via `feast config`:
-
-
-
-
-
Configuration Property
-
Description
-
-
-
-
-
oauth_token_request_url
-
-
Target URL receiving the client-credentials request.
-
-
-
oauth_grant_type
-
-
OAuth grant type. Set as client_credentials
-
-
-
-
oauth_client_id
-
-
Client Id used in the client-credentials request.
-
-
-
oauth_client_secret
-
-
Client secret used in the client-credentials request.
-
-
-
oauth_audience
-
-
-
Target audience of the credential. Set to host URL of target Service.
-
(https://localhost if Service listens on localhost).
-
-
-
-
-{% endtab %}
-{% endtabs %}
-
-#### **Enabling Authentication in Go SDK**
-
-Configure the [Feast Java SDK](https://javadoc.io/doc/dev.feast/feast-sdk/latest/com/gojek/feast/package-summary.html) to use authentication by specifying the credential via `SecurityConfig`:
-
-```go
-// error handling omitted.
-// Use Google Credential as provider.
-cred, _ := feast.NewGoogleCredential("localhost:6566")
-cli, _ := feast.NewSecureGrpcClient("localhost", 6566, feast.SecurityConfig{
- // Specify the credential to provide tokens for Feast Authentication.
- Credential: cred,
-})
-```
-
-{% tabs %}
-{% tab title="Google Credential" %}
-Google Credential uses Service Account credentials JSON file set via`GOOGLE_APPLICATION_CREDENTIALS` environmental variable \([Google Cloud Authentication documentation](https://cloud.google.com/docs/authentication/getting-started)\) to obtain tokens for Authenticating Feast requests:
-
-* Exporting `GOOGLE_APPLICATION_CREDENTIALS`
-
-```bash
-$ export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
-```
-
-* Create a Google Credential with target audience.
-
-```go
-cred, _ := feast.NewGoogleCredential("localhost:6566")
-```
-
-> Target audience of the credential should be set to host URL of target Service. \(ie `https://localhost` if Service listens on `localhost`\):
-{% endtab %}
-
-{% tab title="OAuth Credential" %}
-OAuth Credential makes an OAuth [client credentials](https://auth0.com/docs/flows/call-your-api-using-the-client-credentials-flow) request to obtain the credential/token used to authenticate Feast requests:
-
-* Create OAuth Credential with parameters:
-
-```go
-cred := feast.NewOAuthCredential("localhost:6566", "client_id", "secret", "https://oauth.endpoint/auth")
-```
-
-
-
-
-
Parameter
-
Description
-
-
-
-
-
audience
-
-
-
Target audience of the credential. Set to host URL of target Service.
-
( https://localhost if Service listens on localhost).
-
-
-
-
clientId
-
-
Client Id used in the client-credentials request.
-
-
-
clientSecret
-
-
Client secret used in the client-credentials request.
-
-
-
endpointURL
-
-
Target URL to make the client-credentials request to.
-
-
-
-{% endtab %}
-{% endtabs %}
-
-#### **Enabling Authentication in Java SDK**
-
-Configure the [Feast Java SDK](https://javadoc.io/doc/dev.feast/feast-sdk/latest/com/gojek/feast/package-summary.html) to use authentication by setting credentials via `SecurityConfig`:
-
-```java
-// Use GoogleAuthCredential as provider.
-CallCredentials credentials = new GoogleAuthCredentials(
- Map.of("audience", "localhost:6566"));
-
-FeastClient client = FeastClient.createSecure("localhost", 6566,
- SecurityConfig.newBuilder()
- // Specify the credentials to provide tokens for Feast Authentication.
- .setCredentials(Optional.of(creds))
- .build());
-```
-
-{% tabs %}
-{% tab title="GoogleAuthCredentials" %}
-GoogleAuthCredentials uses Service Account credentials JSON file set via`GOOGLE_APPLICATION_CREDENTIALS` environmental variable \([Google Cloud authentication documentation](https://cloud.google.com/docs/authentication/getting-started)\) to obtain tokens for Authenticating Feast requests:
-
-* Exporting `GOOGLE_APPLICATION_CREDENTIALS`
-
-```bash
-$ export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
-```
-
-* Create a Google Credential with target audience.
-
-```java
-CallCredentials credentials = new GoogleAuthCredentials(
- Map.of("audience", "localhost:6566"));
-```
-
-> Target audience of the credentials should be set to host URL of target Service. \(ie `https://localhost` if Service listens on `localhost`\):
-{% endtab %}
-
-{% tab title="OAuthCredentials" %}
-OAuthCredentials makes an OAuth [client credentials](https://auth0.com/docs/flows/call-your-api-using-the-client-credentials-flow) request to obtain the credential/token used to authenticate Feast requests:
-
-* Create OAuthCredentials with parameters:
-
-```java
-CallCredentials credentials = new OAuthCredentials(Map.of(
- "audience": "localhost:6566",
- "grant_type", "client_credentials",
- "client_id", "some_id",
- "client_id", "secret",
- "oauth_url", "https://oauth.endpoint/auth",
- "jwkEndpointURI", "https://jwk.endpoint/jwk"));
-```
-
-
-
-
-
Parameter
-
Description
-
-
-
-
-
audience
-
-
-
Target audience of the credential. Set to host URL of target Service.
-
( https://localhost if Service listens on localhost).
-
-
-
-
grant_type
-
-
OAuth grant type. Set as client_credentials
-
-
-
-
client_id
-
-
Client Id used in the client-credentials request.
-
-
-
client_secret
-
-
Client secret used in the client-credentials request.
-
-
-
oauth_url
-
-
Target URL to make the client-credentials request to obtain credential.
-
-
-
jwkEndpointURI
-
-
HTTPS URL used to retrieve a JWK that can be used to decode the credential.
-
-
-
-{% endtab %}
-{% endtabs %}
-
-### Authorization
-
-{% hint style="info" %}
-Authorization requires that authentication be configured to obtain a user identity for use in authorizing requests.
-{% endhint %}
-
-Authorization provides access control to FeatureTables and/or Features based on project membership. Users who are members of a project are authorized to:
-
-* Create and/or Update a Feature Table in the Project.
-* Retrieve Feature Values for Features in that Project.
-
-#### **Authorization API/Server**
-
-![Feast Authorization Flow](../../.gitbook/assets/rsz_untitled23%20%282%29%20%282%29%20%282%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29.jpg)
-
-Feast delegates Authorization grants to an external Authorization Server that implements the [Authorization Open API specification](https://github.com/feast-dev/feast/blob/master/common/src/main/resources/api.yaml).
-
-* Feast checks whether a user is authorized to make a request by making a `checkAccessRequest` to the Authorization Server.
-* The Authorization Server should return a `AuthorizationResult` with whether the user is allowed to make the request.
-
-Authorization can be configured for Feast Core and Feast Online Serving via properties in their corresponding `application.yml`
-
-| Configuration Property | Description |
-| :--- | :--- |
-| `feast.security.authorization.enabled` | Enables authorization functionality if `true`. |
-| `feast.security.authorization.provider` | Authentication Provider type. Currently only supports `http` |
-| `feast.security.authorization.option.authorizationUrl` | URL endpoint of Authorization Server to make check access requests to. |
-| `feast.security.authorization.option.subjectClaim` | Optional. Name of the claim of the to extract from the ID Token to include in the check access request as Subject. |
-
-{% hint style="info" %}
-This example of the [Authorization Server with Keto](https://github.com/feast-dev/feast-keto-auth-server) can be used as a reference implementation for implementing an Authorization Server that Feast supports.
-{% endhint %}
-
-### **Authentication & Authorization**
-
-When using Authentication & Authorization, consider:
-
-* Enabling Authentication without Authorization makes authentication **optional**. You can still send unauthenticated requests.
-* Enabling Authorization forces all requests to be authenticated. Requests that are not authenticated are **dropped.**
-
-
-
diff --git a/docs/feast-on-kubernetes/advanced-1/troubleshooting.md b/docs/feast-on-kubernetes/advanced-1/troubleshooting.md
deleted file mode 100644
index 7b0224abe3..0000000000
--- a/docs/feast-on-kubernetes/advanced-1/troubleshooting.md
+++ /dev/null
@@ -1,136 +0,0 @@
-# Troubleshooting
-
-{% hint style="warning" %}
-This page applies to Feast 0.7. The content may be out of date for Feast 0.8+
-{% endhint %}
-
-If at any point in time you cannot resolve a problem, please see the [Community](../../community.md) section for reaching out to the Feast community.
-
-### How can I verify that all services are operational?
-
-#### Docker Compose
-
-The containers should be in an `up` state:
-
-```text
-docker ps
-```
-
-#### Google Kubernetes Engine
-
-All services should either be in a `RUNNING` state or `COMPLETED`state:
-
-```text
-kubectl get pods
-```
-
-### How can I verify that I can connect to all services?
-
-First locate the the host and port of the Feast Services.
-
-#### **Docker Compose \(from inside the docker network\)**
-
-You will probably need to connect using the hostnames of services and standard Feast ports:
-
-```bash
-export FEAST_CORE_URL=core:6565
-export FEAST_ONLINE_SERVING_URL=online_serving:6566
-export FEAST_HISTORICAL_SERVING_URL=historical_serving:6567
-export FEAST_JOBCONTROLLER_URL=jobcontroller:6570
-```
-
-#### **Docker Compose \(from outside the docker network\)**
-
-You will probably need to connect using `localhost` and standard ports:
-
-```bash
-export FEAST_CORE_URL=localhost:6565
-export FEAST_ONLINE_SERVING_URL=localhost:6566
-export FEAST_HISTORICAL_SERVING_URL=localhost:6567
-export FEAST_JOBCONTROLLER_URL=localhost:6570
-```
-
-#### **Google Kubernetes Engine \(GKE\)**
-
-You will need to find the external IP of one of the nodes as well as the NodePorts. Please make sure that your firewall is open for these ports:
-
-```bash
-export FEAST_IP=$(kubectl describe nodes | grep ExternalIP | awk '{print $2}' | head -n 1)
-export FEAST_CORE_URL=${FEAST_IP}:32090
-export FEAST_ONLINE_SERVING_URL=${FEAST_IP}:32091
-export FEAST_HISTORICAL_SERVING_URL=${FEAST_IP}:32092
-```
-
-`netcat`, `telnet`, or even `curl` can be used to test whether all services are available and ports are open, but `grpc_cli` is the most powerful. It can be installed from [here](https://github.com/grpc/grpc/blob/master/doc/command_line_tool.md).
-
-#### Testing Connectivity From Feast Services:
-
-Use `grpc_cli` to test connetivity by listing the gRPC methods exposed by Feast services:
-
-```bash
-grpc_cli ls ${FEAST_CORE_URL} feast.core.CoreService
-```
-
-```bash
-grpc_cli ls ${FEAST_JOBCONTROLLER_URL} feast.core.JobControllerService
-```
-
-```bash
-grpc_cli ls ${FEAST_HISTORICAL_SERVING_URL} feast.serving.ServingService
-```
-
-```bash
-grpc_cli ls ${FEAST_ONLINE_SERVING_URL} feast.serving.ServingService
-```
-
-### How can I print logs from the Feast Services?
-
-Feast will typically have three services that you need to monitor if something goes wrong.
-
-* Feast Core
-* Feast Job Controller
-* Feast Serving \(Online\)
-* Feast Serving \(Batch\)
-
-In order to print the logs from these services, please run the commands below.
-
-#### Docker Compose
-
-Use `docker-compose logs` to obtain Feast component logs:
-
-```text
- docker logs -f feast_core_1
-```
-
-```text
- docker logs -f feast_jobcontroller_1
-```
-
-```text
-docker logs -f feast_historical_serving_1
-```
-
-```text
-docker logs -f feast_online_serving_1
-```
-
-#### Google Kubernetes Engine
-
-Use `kubectl logs` to obtain Feast component logs:
-
-```text
-kubectl logs $(kubectl get pods | grep feast-core | awk '{print $1}')
-```
-
-```text
-kubectl logs $(kubectl get pods | grep feast-jobcontroller | awk '{print $1}')
-```
-
-```text
-kubectl logs $(kubectl get pods | grep feast-serving-batch | awk '{print $1}')
-```
-
-```text
-kubectl logs $(kubectl get pods | grep feast-serving-online | awk '{print $1}')
-```
-
diff --git a/docs/feast-on-kubernetes/advanced-1/upgrading.md b/docs/feast-on-kubernetes/advanced-1/upgrading.md
deleted file mode 100644
index 7e61d3518b..0000000000
--- a/docs/feast-on-kubernetes/advanced-1/upgrading.md
+++ /dev/null
@@ -1,113 +0,0 @@
-# Upgrading Feast
-
-### Migration from v0.6 to v0.7
-
-#### Feast Core Validation changes
-
-In v0.7, Feast Core no longer accepts starting with number \(0-9\) and using dash in names for:
-
-* Project
-* Feature Set
-* Entities
-* Features
-
-Migrate all project, feature sets, entities, feature names:
-
-* with ‘-’ by recreating them with '-' replace with '\_'
-* recreate any names with a number \(0-9\) as the first letter to one without.
-
-Feast now prevents feature sets from being applied if no store is subscribed to that Feature Set.
-
-* Ensure that a store is configured to subscribe to the Feature Set before applying the Feature Set.
-
-#### Feast Core's Job Coordinator is now Feast Job Controller
-
-In v0.7, Feast Core's Job Coordinator has been decoupled from Feast Core and runs as a separate Feast Job Controller application. See its [Configuration reference](../reference-1/configuration-reference.md#2-feast-core-serving-and-job-controller) for how to configure Feast Job Controller.
-
-**Ingestion Job API**
-
-In v0.7, the following changes are made to the Ingestion Job API:
-
-* Changed List Ingestion Job API to return list of `FeatureSetReference` instead of list of FeatureSet in response.
-* Moved `ListIngestionJobs`, `StopIngestionJob`, `RestartIngestionJob` calls from `CoreService` to `JobControllerService`.
-* Python SDK/CLI: Added new [Job Controller client ](https://github.com/feast-dev/feast/blob/master/sdk/python/feast/contrib/job_controller/client.py)and `jobcontroller_url` config option.
-
-Users of the Ingestion Job API via gRPC should migrate by:
-
-* Add new client to connect to Job Controller endpoint to call `JobControllerService` and call `ListIngestionJobs`, `StopIngestionJob`, `RestartIngestionJob` from new client.
-* Migrate code to accept feature references instead of feature sets returned in `ListIngestionJobs` response.
-
-Users of Ingestion Job via Python SDK \(ie `feast ingest-jobs list` or `client.stop_ingest_job()` etc.\) should migrate by:
-
-* `ingest_job()`methods only: Create a new separate [Job Controller client](https://github.com/feast-dev/feast/blob/master/sdk/python/feast/contrib/job_controller/client.py) to connect to the job controller and call `ingest_job()` methods using the new client.
-* Configure the Feast Job Controller endpoint url via `jobcontroller_url` config option.
-
-#### Configuration Properties Changes
-
-* Rename `feast.jobs.consolidate-jobs-per-source property` to `feast.jobs.controller.consolidate-jobs-per-sources`
-* Rename`feast.security.authorization.options.subjectClaim` to `feast.security.authentication.options.subjectClaim`
-* Rename `feast.logging.audit.messageLoggingEnabled` to `feast.audit.messageLogging.enabled`
-
-### Migration from v0.5 to v0.6
-
-#### Database schema
-
-In Release 0.6 we introduced [Flyway](https://flywaydb.org/) to handle schema migrations in PostgreSQL. Flyway is integrated into `core` and for now on all migrations will be run automatically on `core` start. It uses table `flyway_schema_history` in the same database \(also created automatically\) to keep track of already applied migrations. So no specific maintenance should be needed.
-
-If you already have existing deployment of feast 0.5 - Flyway will detect existing tables and omit first baseline migration.
-
-After `core` started you should have `flyway_schema_history` look like this
-
-```text
->> select version, description, script, checksum from flyway_schema_history
-
-version | description | script | checksum
---------+-----------------------------------------+-----------------------------------------+------------
- 1 | << Flyway Baseline >> | << Flyway Baseline >> |
- 2 | RELEASE 0.6 Generalizing Source AND ... | V2__RELEASE_0.6_Generalizing_Source_... | 1537500232
-```
-
-In this release next major schema changes were done:
-
-* Source is not shared between FeatureSets anymore. It's changed to 1:1 relation
-
- and source's primary key is now auto-incremented number.
-
-* Due to generalization of Source `sources.topics` & `sources.bootstrap_servers` columns were deprecated.
-
- They will be replaced with `sources.config`. Data migration handled by code when respected Source is used.
-
- `topics` and `bootstrap_servers` will be deleted in the next release.
-
-* Job \(table `jobs`\) is no longer connected to `Source` \(table `sources`\) since it uses consolidated source for optimization purposes.
-
- All data required by Job would be embedded in its table.
-
-New Models \(tables\):
-
-* feature\_statistics
-
-Minor changes:
-
-* FeatureSet has new column version \(see [proto](https://github.com/feast-dev/feast/blob/master/protos/feast/core/FeatureSet.proto) for details\)
-* Connecting table `jobs_feature_sets` in many-to-many relation between jobs & feature sets
-
- has now `version` and `delivery_status`.
-
-### Migration from v0.4 to v0.6
-
-#### Database
-
-For all versions earlier than 0.5 seamless migration is not feasible due to earlier breaking changes and creation of new database will be required.
-
-Since database will be empty - first \(baseline\) migration would be applied:
-
-```text
->> select version, description, script, checksum from flyway_schema_history
-
-version | description | script | checksum
---------+-----------------------------------------+-----------------------------------------+------------
- 1 | Baseline | V1__Baseline.sql | 1091472110
- 2 | RELEASE 0.6 Generalizing Source AND ... | V2__RELEASE_0.6_Generalizing_Source_... | 1537500232
-```
-
diff --git a/docs/feast-on-kubernetes/concepts/README.md b/docs/feast-on-kubernetes/concepts/README.md
deleted file mode 100644
index e834417d3f..0000000000
--- a/docs/feast-on-kubernetes/concepts/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Concepts
-
diff --git a/docs/feast-on-kubernetes/concepts/architecture.md b/docs/feast-on-kubernetes/concepts/architecture.md
deleted file mode 100644
index f4cf23eb95..0000000000
--- a/docs/feast-on-kubernetes/concepts/architecture.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Architecture
-
-![](../../.gitbook/assets/image%20%286%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%283%29%20%282%29%20%281%29%20%282%29.png)
-
-## Sequence description
-
-1. **Log Raw Events:** Production backend applications are configured to emit internal state changes as events to a stream.
-2. **Create Stream Features:** Stream processing systems like Flink, Spark, and Beam are used to transform and refine events and to produce features that are logged back to the stream.
-3. **Log Streaming Features:** Both raw and refined events are logged into a data lake or batch storage location.
-4. **Create Batch Features:** ELT/ETL systems like Spark and SQL are used to transform data in the batch store.
-5. **Define and Ingest Features:** The Feast user defines [feature tables](feature-tables.md) based on the features available in batch and streaming sources and publish these definitions to Feast Core.
-6. **Poll Feature Definitions:** The Feast Job Service polls for new or changed feature definitions.
-7. **Start Ingestion Jobs:** Every new feature table definition results in a new ingestion job being provisioned \(see limitations\).
-8. **Batch Ingestion:** Batch ingestion jobs are short-lived jobs that load data from batch sources into either an offline or online store \(see limitations\).
-9. **Stream Ingestion:** Streaming ingestion jobs are long-lived jobs that load data from stream sources into online stores. A stream source and batch source on a feature table must have the same features/fields.
-10. **Model Training:** A model training pipeline is launched. It uses the Feast Python SDK to retrieve a training dataset and trains a model.
-11. **Get Historical Features:** Feast exports a point-in-time correct training dataset based on the list of features and entity DataFrame provided by the model training pipeline.
-12. **Deploy Model:** The trained model binary \(and list of features\) are deployed into a model serving system.
-13. **Get Prediction:** A backend system makes a request for a prediction from the model serving service.
-14. **Retrieve Online Features:** The model serving service makes a request to the Feast Online Serving service for online features using a Feast SDK.
-15. **Return Prediction:** The model serving service makes a prediction using the returned features and returns the outcome.
-
-{% hint style="warning" %}
-Limitations
-
-* Only Redis is supported for online storage.
-* Batch ingestion jobs must be triggered from your own scheduler like Airflow. Streaming ingestion jobs are automatically launched by the Feast Job Service.
-{% endhint %}
-
-## Components:
-
-A complete Feast deployment contains the following components:
-
-* **Feast Core:** Acts as the central registry for feature and entity definitions in Feast.
-* **Feast Job Service:** Manages data processing jobs that load data from sources into stores, and jobs that export training datasets.
-* **Feast Serving:** Provides low-latency access to feature values in an online store.
-* **Feast Python SDK CLI:** The primary user facing SDK. Used to:
- * Manage feature definitions with Feast Core.
- * Launch jobs through the Feast Job Service.
- * Retrieve training datasets.
- * Retrieve online features.
-* **Online Store:** The online store is a database that stores only the latest feature values for each entity. The online store can be populated by either batch ingestion jobs \(in the case the user has no streaming source\), or can be populated by a streaming ingestion job from a streaming source. Feast Online Serving looks up feature values from the online store.
-* **Offline Store:** The offline store persists batch data that has been ingested into Feast. This data is used for producing training datasets.
-* **Feast Spark SDK:** A Spark specific Feast SDK. Allows teams to use Spark for loading features into an online store and for building training datasets over offline sources.
-
-Please see the [configuration reference](../reference-1/configuration-reference.md#overview) for more details on configuring these components.
-
-{% hint style="info" %}
-Java and Go Clients are also available for online feature retrieval. See [API Reference](../reference-1/api/).
-{% endhint %}
-
diff --git a/docs/feast-on-kubernetes/concepts/entities.md b/docs/feast-on-kubernetes/concepts/entities.md
deleted file mode 100644
index e8134cf142..0000000000
--- a/docs/feast-on-kubernetes/concepts/entities.md
+++ /dev/null
@@ -1,64 +0,0 @@
-# Entities
-
-## Overview
-
-An entity is any domain object that can be modeled and about which information can be stored. Entities are usually recognizable concepts, either concrete or abstract, such as persons, places, things, or events.
-
-Examples of entities in the context of ride-hailing and food delivery: `customer`, `order`, `driver`, `restaurant`, `dish`, `area`.
-
-Entities are important in the context of feature stores since features are always properties of a specific entity. For example, we could have a feature `total_trips_24h` for driver `D011234` with a feature value of `11`.
-
-Feast uses entities in the following way:
-
-* Entities serve as the keys used to look up features for producing training datasets and online feature values.
-* Entities serve as a natural grouping of features in a feature table. A feature table must belong to an entity \(which could be a composite entity\)
-
-## Structure of an Entity
-
-When creating an entity specification, consider the following fields:
-
-* **Name**: Name of the entity
-* **Description**: Description of the entity
-* **Value Type**: Value type of the entity. Feast will attempt to coerce entity columns in your data sources into this type.
-* **Labels**: Labels are maps that allow users to attach their own metadata to entities
-
-A valid entity specification is shown below:
-
-```python
-customer = Entity(
- name="customer_id",
- description="Customer id for ride customer",
- value_type=ValueType.INT64,
- labels={}
-)
-```
-
-## Working with an Entity
-
-### Creating an Entity:
-
-```python
-# Create a customer entity
-customer_entity = Entity(name="customer_id", description="ID of car customer")
-client.apply(customer_entity)
-```
-
-### Updating an Entity:
-
-```python
-# Update a customer entity
-customer_entity = client.get_entity("customer_id")
-customer_entity.description = "ID of bike customer"
-client.apply(customer_entity)
-```
-
-Permitted changes include:
-
-* The entity's description and labels
-
-The following changes are not permitted:
-
-* Project
-* Name of an entity
-* Type
-
diff --git a/docs/feast-on-kubernetes/concepts/feature-tables.md b/docs/feast-on-kubernetes/concepts/feature-tables.md
deleted file mode 100644
index 5b5c0efc56..0000000000
--- a/docs/feast-on-kubernetes/concepts/feature-tables.md
+++ /dev/null
@@ -1,122 +0,0 @@
-# Feature Tables
-
-## Overview
-
-Feature tables are both a schema and a logical means of grouping features, data [sources](sources.md), and other related metadata.
-
-Feature tables serve the following purposes:
-
-* Feature tables are a means for defining the location and properties of data [sources](sources.md).
-* Feature tables are used to create within Feast a database-level structure for the storage of feature values.
-* The data sources described within feature tables allow Feast to find and ingest feature data into stores within Feast.
-* Feature tables ensure data is efficiently stored during [ingestion](../user-guide/define-and-ingest-features.md) by providing a grouping mechanism of features values that occur on the same event timestamp.
-
-{% hint style="info" %}
-Feast does not yet apply feature transformations. Transformations are currently expected to happen before data is ingested into Feast. The data sources described within feature tables should reference feature values in their already transformed form.
-{% endhint %}
-
-### Features
-
-A feature is an individual measurable property observed on an entity. For example the amount of transactions \(feature\) a customer \(entity\) has completed. Features are used for both model training and scoring \(batch, online\).
-
-Features are defined as part of feature tables. Since Feast does not apply transformations, a feature is basically a schema that only contains a name and a type:
-
-```python
-avg_daily_ride = Feature("average_daily_rides", ValueType.FLOAT)
-```
-
-Visit [FeatureSpec](https://api.docs.feast.dev/grpc/feast.core.pb.html#FeatureSpecV2) for the complete feature specification API.
-
-## Structure of a Feature Table
-
-Feature tables contain the following fields:
-
-* **Name:** Name of feature table. This name must be unique within a project.
-* **Entities:** List of [entities](entities.md) to associate with the features defined in this feature table. Entities are used as lookup keys when retrieving features from a feature table.
-* **Features:** List of features within a feature table.
-* **Labels:** Labels are arbitrary key-value properties that can be defined by users.
-* **Max age:** Max age affect the retrieval of features from a feature table. Age is measured as the duration of time between the event timestamp of a feature and the lookup time on an [entity key]() used to retrieve the feature. Feature values outside max age will be returned as unset values. Max age allows for eviction of keys from online stores and limits the amount of historical scanning required for historical feature values during retrieval.
-* **Batch Source:** The batch data source from which Feast will ingest feature values into stores. This can either be used to back-fill stores before switching over to a streaming source, or it can be used as the primary source of data for a feature table. Visit [Sources](sources.md) to learn more about batch sources.
-* **Stream Source:** The streaming data source from which you can ingest streaming feature values into Feast. Streaming sources must be paired with a batch source containing the same feature values. A streaming source is only used to populate online stores. The batch equivalent source that is paired with a streaming source is used during the generation of historical feature datasets. Visit [Sources](sources.md) to learn more about stream sources.
-
-Here is a ride-hailing example of a valid feature table specification:
-
-{% tabs %}
-{% tab title="driver\_trips\_feature\_table.py" %}
-```python
-from feast import BigQuerySource, FeatureTable, Feature, ValueType
-from google.protobuf.duration_pb2 import Duration
-
-driver_ft = FeatureTable(
- name="driver_trips",
- entities=["driver_id"],
- features=[
- Feature("average_daily_rides", ValueType.FLOAT),
- Feature("rating", ValueType.FLOAT)
- ],
- max_age=Duration(seconds=3600),
- labels={
- "team": "driver_matching"
- },
- batch_source=BigQuerySource(
- table_ref="gcp_project:bq_dataset.bq_table",
- event_timestamp_column="datetime",
- created_timestamp_column="timestamp",
- field_mapping={
- "rating": "driver_rating"
- }
- )
-)
-```
-{% endtab %}
-{% endtabs %}
-
-By default, Feast assumes that features specified in the feature-table specification corresponds one-to-one to the fields found in the sources. All features defined in a feature table should be available in the defined sources.
-
-Field mappings can be used to map features defined in Feast to fields as they occur in data sources.
-
-In the example feature-specification table above, we use field mappings to ensure the feature named `rating` in the batch source is mapped to the field named `driver_rating`.
-
-## Working with a Feature Table
-
-#### Creating a Feature Table
-
-```python
-driver_ft = FeatureTable(...)
-client.apply(driver_ft)
-```
-
-#### Updating a Feature Table
-
-```python
-driver_ft = FeatureTable()
-
-client.apply(driver_ft)
-
-driver_ft.labels = {"team": "marketplace"}
-
-client.apply(driver_ft)
-```
-
-#### Feast currently supports the following changes to feature tables:
-
-* Adding new features.
-* Removing features.
-* Updating source, max age, and labels.
-
-{% hint style="warning" %}
-Deleted features are archived, rather than removed completely. Importantly, new features cannot use the names of these deleted features.
-{% endhint %}
-
-#### Feast currently does not support the following changes to feature tables:
-
-* Changes to the project or name of a feature table.
-* Changes to entities related to a feature table.
-* Changes to names and types of existing features.
-
-#### Deleting a Feature Table
-
-{% hint style="danger" %}
-Feast currently does not support the deletion of feature tables.
-{% endhint %}
-
diff --git a/docs/feast-on-kubernetes/concepts/overview.md b/docs/feast-on-kubernetes/concepts/overview.md
deleted file mode 100644
index 461510984b..0000000000
--- a/docs/feast-on-kubernetes/concepts/overview.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Overview
-
-### Concepts
-
-[Entities](entities.md) are objects in an organization like customers, transactions, and drivers, products, etc.
-
-[Sources](sources.md) are external sources of data where feature data can be found.
-
-[Feature Tables](feature-tables.md) are objects that define logical groupings of features, data sources, and other related metadata.
-
-### Concept Hierarchy
-
-![](../../.gitbook/assets/image%20%284%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%283%29%20%283%29%20%283%29%20%283%29%20%281%29.png)
-
-Feast contains the following core concepts:
-
-* **Projects:** Serve as a top level namespace for all Feast resources. Each project is a completely independent environment in Feast. Users can only work in a single project at a time.
-* **Entities:** Entities are the objects in an organization on which features occur. They map to your business domain \(users, products, transactions, locations\).
-* **Feature Tables:** Defines a group of features that occur on a specific entity.
-* **Features:** Individual feature within a feature table.
-
diff --git a/docs/feast-on-kubernetes/concepts/sources.md b/docs/feast-on-kubernetes/concepts/sources.md
deleted file mode 100644
index 65595d94a9..0000000000
--- a/docs/feast-on-kubernetes/concepts/sources.md
+++ /dev/null
@@ -1,90 +0,0 @@
-# Sources
-
-### Overview
-
-Sources are descriptions of external feature data and are registered to Feast as part of [feature tables](feature-tables.md). Once registered, Feast can ingest feature data from these sources into stores.
-
-Currently, Feast supports the following source types:
-
-#### Batch Source
-
-* File \(as in Spark\): Parquet \(only\).
-* BigQuery
-
-#### Stream Source
-
-* Kafka
-* Kinesis
-
-The following encodings are supported on streams
-
-* Avro
-* Protobuf
-
-### Structure of a Source
-
-For both batch and stream sources, the following configurations are necessary:
-
-* **Event timestamp column**: Name of column containing timestamp when event data occurred. Used during point-in-time join of feature values to [entity timestamps]().
-* **Created timestamp column**: Name of column containing timestamp when data is created. Used to deduplicate data when multiple copies of the same [entity key]() is ingested.
-
-Example data source specifications:
-
-{% tabs %}
-{% tab title="batch\_sources.py" %}
-```python
-from feast import FileSource
-from feast.data_format import ParquetFormat
-
-batch_file_source = FileSource(
- file_format=ParquetFormat(),
- file_url="file:///feast/customer.parquet",
- event_timestamp_column="event_timestamp",
- created_timestamp_column="created_timestamp",
-)
-```
-{% endtab %}
-
-{% tab title="stream\_sources.py" %}
-```python
-from feast import KafkaSource
-from feast.data_format import ProtoFormat
-
-stream_kafka_source = KafkaSource(
- bootstrap_servers="localhost:9094",
- message_format=ProtoFormat(class_path="class.path"),
- topic="driver_trips",
- event_timestamp_column="event_timestamp",
- created_timestamp_column="created_timestamp",
-)
-```
-{% endtab %}
-{% endtabs %}
-
-The [Feast Python API documentation](https://api.docs.feast.dev/python/) provides more information about options to specify for the above sources.
-
-### Working with a Source
-
-#### Creating a Source
-
-Sources are defined as part of [feature tables](feature-tables.md):
-
-```python
-batch_bigquery_source = BigQuerySource(
- table_ref="gcp_project:bq_dataset.bq_table",
- event_timestamp_column="event_timestamp",
- created_timestamp_column="created_timestamp",
-)
-
-stream_kinesis_source = KinesisSource(
- bootstrap_servers="localhost:9094",
- record_format=ProtoFormat(class_path="class.path"),
- region="us-east-1",
- stream_name="driver_trips",
- event_timestamp_column="event_timestamp",
- created_timestamp_column="created_timestamp",
-)
-```
-
-Feast ensures that the source complies with the schema of the feature table. These specified data sources can then be included inside a feature table specification and registered to Feast Core.
-
diff --git a/docs/feast-on-kubernetes/concepts/stores.md b/docs/feast-on-kubernetes/concepts/stores.md
deleted file mode 100644
index 59deac0a6a..0000000000
--- a/docs/feast-on-kubernetes/concepts/stores.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# Stores
-
-In Feast, a store is a database that is populated with feature data that will ultimately be served to models.
-
-## Offline \(Historical\) Store
-
-The offline store maintains historical copies of feature values. These features are grouped and stored in feature tables. During retrieval of historical data, features are queries from these feature tables in order to produce training datasets.
-
-## Online Store
-
-The online store maintains only the latest values for a specific feature.
-
-* Feature values are stored based on their [entity keys]()
-* Feast currently supports Redis as an online store.
-* Online stores are meant for very high throughput writes from ingestion jobs and very low latency access to features during online serving.
-
-{% hint style="info" %}
-Feast only supports a single online store in production
-{% endhint %}
-
diff --git a/docs/feast-on-kubernetes/getting-started/README.md b/docs/feast-on-kubernetes/getting-started/README.md
deleted file mode 100644
index b9423182fe..0000000000
--- a/docs/feast-on-kubernetes/getting-started/README.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# Getting started
-
-{% hint style="danger" %}
-Feast on Kubernetes is only supported using Feast 0.9 \(and below\). We are working to add support for Feast on Kubernetes with the latest release of Feast. Please see our [roadmap](../../roadmap.md) for more details.
-{% endhint %}
-
-### Install Feast
-
-If you would like to deploy a new installation of Feast, click on [Install Feast](install-feast/)
-
-{% page-ref page="install-feast/" %}
-
-### Connect to Feast
-
-If you would like to connect to an existing Feast deployment, click on [Connect to Feast](connect-to-feast/)
-
-{% page-ref page="connect-to-feast/" %}
-
-### Learn Feast
-
-If you would like to learn more about Feast, click on [Learn Feast](learn-feast.md)
-
-{% page-ref page="learn-feast.md" %}
-
diff --git a/docs/feast-on-kubernetes/getting-started/connect-to-feast/README.md b/docs/feast-on-kubernetes/getting-started/connect-to-feast/README.md
deleted file mode 100644
index 4333359f90..0000000000
--- a/docs/feast-on-kubernetes/getting-started/connect-to-feast/README.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Connect to Feast
-
-### Feast Python SDK
-
-The Feast Python SDK is used as a library to interact with a Feast deployment.
-
-* Define, register, and manage entities and features
-* Ingest data into Feast
-* Build and retrieve training datasets
-* Retrieve online features
-
-{% page-ref page="python-sdk.md" %}
-
-### Feast CLI
-
-The Feast CLI is a command line implementation of the Feast Python SDK.
-
-* Define, register, and manage entities and features from the terminal
-* Ingest data into Feast
-* Manage ingestion jobs
-
-{% page-ref page="feast-cli.md" %}
-
-### Online Serving Clients
-
-The following clients can be used to retrieve online feature values:
-
-* [Feast Python SDK](https://api.docs.feast.dev/python/)
-* [Feast Go SDK](https://godoc.org/github.com/feast-dev/feast/sdk/go)
-* [Feast Java SDK](https://javadoc.io/doc/dev.feast/feast-sdk)
-
diff --git a/docs/feast-on-kubernetes/getting-started/connect-to-feast/feast-cli.md b/docs/feast-on-kubernetes/getting-started/connect-to-feast/feast-cli.md
deleted file mode 100644
index 47471b8471..0000000000
--- a/docs/feast-on-kubernetes/getting-started/connect-to-feast/feast-cli.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# Feast CLI
-
-Install the Feast CLI using pip:
-
-```bash
-pip install feast==0.9.*
-```
-
-Configure the CLI to connect to your Feast Core deployment:
-
-```text
-feast config set core_url your.feast.deployment
-```
-
-{% hint style="info" %}
-By default, all configuration is stored in `~/.feast/config`
-{% endhint %}
-
-The CLI is a wrapper around the [Feast Python SDK](python-sdk.md):
-
-```aspnet
-$ feast
-
-Usage: feast [OPTIONS] COMMAND [ARGS]...
-
-Options:
- --help Show this message and exit.
-
-Commands:
- config View and edit Feast properties
- entities Create and manage entities
- feature-tables Create and manage feature tables
- jobs Create and manage jobs
- projects Create and manage projects
- version Displays version and connectivity information
-```
-
diff --git a/docs/feast-on-kubernetes/getting-started/connect-to-feast/python-sdk.md b/docs/feast-on-kubernetes/getting-started/connect-to-feast/python-sdk.md
deleted file mode 100644
index 3e7c86880e..0000000000
--- a/docs/feast-on-kubernetes/getting-started/connect-to-feast/python-sdk.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# Python SDK
-
-Install the [Feast Python SDK](https://api.docs.feast.dev/python/) using pip:
-
-```bash
-pip install feast==0.9.*
-```
-
-Connect to an existing Feast Core deployment:
-
-```python
-from feast import Client
-
-# Connect to an existing Feast Core deployment
-client = Client(core_url='feast.example.com:6565')
-
-# Ensure that your client is connected by printing out some feature tables
-client.list_feature_tables()
-```
-
diff --git a/docs/feast-on-kubernetes/getting-started/install-feast/README.md b/docs/feast-on-kubernetes/getting-started/install-feast/README.md
deleted file mode 100644
index 0b77ab431a..0000000000
--- a/docs/feast-on-kubernetes/getting-started/install-feast/README.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# Install Feast
-
-A production deployment of Feast is deployed using Kubernetes.
-
-## Kubernetes \(with Helm\)
-
-This guide installs Feast into an existing Kubernetes cluster using Helm. The installation is not specific to any cloud platform or environment, but requires Kubernetes and Helm.
-
-{% page-ref page="kubernetes-with-helm.md" %}
-
-## Amazon EKS \(with Terraform\)
-
-This guide installs Feast into an AWS environment using Terraform. The Terraform script is opinionated and intended to allow you to start quickly.
-
-{% page-ref page="kubernetes-amazon-eks-with-terraform.md" %}
-
-## Azure AKS \(with Helm\)
-
-This guide installs Feast into an Azure AKS environment with Helm.
-
-{% page-ref page="kubernetes-azure-aks-with-helm.md" %}
-
-## Azure AKS \(with Terraform\)
-
-This guide installs Feast into an Azure environment using Terraform. The Terraform script is opinionated and intended to allow you to start quickly.
-
-{% page-ref page="kubernetes-azure-aks-with-terraform.md" %}
-
-## Google Cloud GKE \(with Terraform\)
-
-This guide installs Feast into a Google Cloud environment using Terraform. The Terraform script is opinionated and intended to allow you to start quickly.
-
-{% page-ref page="google-cloud-gke-with-terraform.md" %}
-
-## IBM Cloud Kubernetes Service \(IKS\) and Red Hat OpenShift \(using Kustomize\)
-
-This guide installs Feast into an existing [IBM Cloud Kubernetes Service](https://www.ibm.com/cloud/kubernetes-service) or [Red Hat OpenShift on IBM Cloud](https://www.ibm.com/cloud/openshift) using Kustomize.
-
-{% page-ref page="ibm-cloud-iks-with-kustomize.md" %}
-
diff --git a/docs/feast-on-kubernetes/getting-started/install-feast/google-cloud-gke-with-terraform.md b/docs/feast-on-kubernetes/getting-started/install-feast/google-cloud-gke-with-terraform.md
deleted file mode 100644
index a3252cf0bb..0000000000
--- a/docs/feast-on-kubernetes/getting-started/install-feast/google-cloud-gke-with-terraform.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# Google Cloud GKE \(with Terraform\)
-
-### Overview
-
-This guide installs Feast on GKE using our [reference Terraform configuration](https://github.com/feast-dev/feast/tree/master/infra/terraform/gcp).
-
-{% hint style="info" %}
-The Terraform configuration used here is a greenfield installation that neither assumes anything about, nor integrates with, existing resources in your GCP account. The Terraform configuration presents an easy way to get started, but you may want to customize this set up before using Feast in production.
-{% endhint %}
-
-This Terraform configuration creates the following resources:
-
-* GKE cluster
-* Feast services running on GKE
-* Google Memorystore \(Redis\) as online store
-* Dataproc cluster
-* Kafka running on GKE, exposed to the dataproc cluster via internal load balancer
-
-### 1. Requirements
-
-* Install [Terraform](https://www.terraform.io/) > = 0.12 \(tested with 0.13.3\)
-* Install [Helm](https://helm.sh/docs/intro/install/) \(tested with v3.3.4\)
-* GCP [authentication](https://cloud.google.com/docs/authentication) and sufficient [privilege](https://cloud.google.com/iam/docs/understanding-roles) to create the resources listed above.
-
-### 2. Configure Terraform
-
-Create a `.tfvars` file under`feast/infra/terraform/gcp`. Name the file. In our example, we use `my_feast.tfvars`. You can see the full list of configuration variables in `variables.tf`. Sample configurations are provided below:
-
-{% code title="my\_feast.tfvars" %}
-```typescript
-gcp_project_name = "kf-feast"
-name_prefix = "feast-0-8"
-region = "asia-east1"
-gke_machine_type = "n1-standard-2"
-network = "default"
-subnetwork = "default"
-dataproc_staging_bucket = "feast-dataproc"
-```
-{% endcode %}
-
-### 3. Apply
-
-After completing the configuration, initialize Terraform and apply:
-
-```bash
-$ cd feast/infra/terraform/gcp
-$ terraform init
-$ terraform apply -var-file=my_feast.tfvars
-```
-
-
-
diff --git a/docs/feast-on-kubernetes/getting-started/install-feast/ibm-cloud-iks-with-kustomize.md b/docs/feast-on-kubernetes/getting-started/install-feast/ibm-cloud-iks-with-kustomize.md
deleted file mode 100644
index 0abca57b6d..0000000000
--- a/docs/feast-on-kubernetes/getting-started/install-feast/ibm-cloud-iks-with-kustomize.md
+++ /dev/null
@@ -1,193 +0,0 @@
-# IBM Cloud Kubernetes Service \(IKS\) and Red Hat OpenShift \(with Kustomize\)
-
-## Overview
-
-This guide installs Feast on an existing IBM Cloud Kubernetes cluster or Red Hat OpenShift on IBM Cloud , and ensures the following services are running:
-
-* Feast Core
-* Feast Online Serving
-* Postgres
-* Redis
-* Kafka \(Optional\)
-* Feast Jupyter \(Optional\)
-* Prometheus \(Optional\)
-
-## 1. Prerequisites
-
-1. [IBM Cloud Kubernetes Service](https://www.ibm.com/cloud/kubernetes-service) or [Red Hat OpenShift on IBM Cloud](https://www.ibm.com/cloud/openshift)
-2. Install [Kubectl](https://cloud.ibm.com/docs/containers?topic=containers-cs_cli_install#kubectl) that matches the major.minor versions of your IKS or Install the [OpenShift CLI](https://cloud.ibm.com/docs/openshift?topic=openshift-openshift-cli#cli_oc) that matches your local operating system and OpenShift cluster version.
-3. Install [Helm 3](https://helm.sh/)
-4. Install [Kustomize](https://kubectl.docs.kubernetes.io/installation/kustomize/)
-
-## 2. Preparation
-
-### IBM Cloud Block Storage Setup \(IKS only\)
-
-:warning: If you have Red Hat OpenShift Cluster on IBM Cloud skip to this [section](ibm-cloud-iks-with-kustomize.md#Security-Context-Constraint-Setup).
-
-By default, IBM Cloud Kubernetes cluster uses [IBM Cloud File Storage](https://www.ibm.com/cloud/file-storage) based on NFS as the default storage class, and non-root users do not have write permission on the volume mount path for NFS-backed storage. Some common container images in Feast, such as Redis, Postgres, and Kafka specify a non-root user to access the mount path in the images. When containers are deployed using these images, the containers fail to start due to insufficient permissions of the non-root user creating folders on the mount path.
-
-[IBM Cloud Block Storage](https://www.ibm.com/cloud/block-storage) allows for the creation of raw storage volumes and provides faster performance without the permission restriction of NFS-backed storage
-
-Therefore, to deploy Feast we need to set up [IBM Cloud Block Storage](https://cloud.ibm.com/docs/containers?topic=containers-block_storage#install_block) as the default storage class so that you can have all the functionalities working and get the best experience from Feast.
-
-1. [Follow the instructions](https://helm.sh/docs/intro/install/) to install the Helm version 3 client on your local machine.
-2. Add the IBM Cloud Helm chart repository to the cluster where you want to use the IBM Cloud Block Storage plug-in.
-
- ```text
- helm repo add iks-charts https://icr.io/helm/iks-charts
- helm repo update
- ```
-
-3. Install the IBM Cloud Block Storage plug-in. When you install the plug-in, pre-defined block storage classes are added to your cluster.
-
- ```text
- helm install v2.0.2 iks-charts/ibmcloud-block-storage-plugin -n kube-system
- ```
-
- Example output:
-
- ```text
- NAME: v2.0.2
- LAST DEPLOYED: Fri Feb 5 12:29:50 2021
- NAMESPACE: kube-system
- STATUS: deployed
- REVISION: 1
- NOTES:
- Thank you for installing: ibmcloud-block-storage-plugin. Your release is named: v2.0.2
- ...
- ```
-
-4. Verify that all block storage plugin pods are in a "Running" state.
-
- ```text
- kubectl get pods -n kube-system | grep ibmcloud-block-storage
- ```
-
-5. Verify that the storage classes for Block Storage were added to your cluster.
-
- ```text
- kubectl get storageclasses | grep ibmc-block
- ```
-
-6. Set the Block Storage as the default storageclass.
-
- ```text
- kubectl patch storageclass ibmc-block-gold -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
- kubectl patch storageclass ibmc-file-gold -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
-
- # Check the default storageclass is block storage
- kubectl get storageclass | grep \(default\)
- ```
-
- Example output:
-
- ```text
- ibmc-block-gold (default) ibm.io/ibmc-block 65s
- ```
-
- **Security Context Constraint Setup \(OpenShift only\)**
-
-By default, in OpenShift, all pods or containers will use the [Restricted SCC](https://docs.openshift.com/container-platform/4.6/authentication/managing-security-context-constraints.html) which limits the UIDs pods can run with, causing the Feast installation to fail. To overcome this, you can allow Feast pods to run with any UID by executing the following:
-
-```text
-oc adm policy add-scc-to-user anyuid -z default,kf-feast-kafka -n feast
-```
-
-## 3. Installation
-
-Install Feast using kustomize. The pods may take a few minutes to initialize.
-
-```bash
-git clone https://github.com/kubeflow/manifests
-cd manifests/contrib/feast/
-kustomize build feast/base | kubectl apply -n feast -f -
-```
-
-### Optional: Enable Feast Jupyter and Kafka
-
-You may optionally enable the Feast Jupyter component which contains code examples to demonstrate Feast. Some examples require Kafka to stream real time features to the Feast online serving. To enable, edit the following properties in the `values.yaml` under the `manifests/contrib/feast` folder:
-
-```text
-kafka.enabled: true
-feast-jupyter.enabled: true
-```
-
-Then regenerate the resource manifests and deploy:
-
-```text
-make feast/base
-kustomize build feast/base | kubectl apply -n feast -f -
-```
-
-## 4. Use Feast Jupyter Notebook Server to connect to Feast
-
-After all the pods are in a `RUNNING` state, port-forward to the Jupyter Notebook Server in the cluster:
-
-```bash
-kubectl port-forward \
-$(kubectl get pod -l app=feast-jupyter -o custom-columns=:metadata.name) 8888:8888 -n feast
-```
-
-```text
-Forwarding from 127.0.0.1:8888 -> 8888
-Forwarding from [::1]:8888 -> 8888
-```
-
-You can now connect to the bundled Jupyter Notebook Server at `localhost:8888` and follow the example Jupyter notebook.
-
-{% embed url="http://localhost:8888/tree?" caption="" %}
-
-## 5. Uninstall Feast
-
-```text
-kustomize build feast/base | kubectl delete -n feast -f -
-```
-
-## 6. Troubleshooting
-
-When running the minimal\_ride\_hailing\_example Jupyter Notebook example the following errors may occur:
-
-1. When running `job = client.get_historical_features(...)`:
-
- ```text
- KeyError: 'historical_feature_output_location'
- ```
-
- or
-
- ```text
- KeyError: 'spark_staging_location'
- ```
-
- Add the following environment variable:
-
- ```text
- os.environ["FEAST_HISTORICAL_FEATURE_OUTPUT_LOCATION"] = "file:///home/jovyan/historical_feature_output"
- os.environ["FEAST_SPARK_STAGING_LOCATION"] = "file:///home/jovyan/test_data"
- ```
-
-2. When running `job.get_status()`
-
- ```text
-
- ```
-
- Add the following environment variable:
-
- ```text
- os.environ["FEAST_REDIS_HOST"] = "feast-release-redis-master"
- ```
-
-3. When running `job = client.start_stream_to_online_ingestion(...)`
-
- ```text
- org.apache.kafka.vendor.common.KafkaException: Failed to construct kafka consumer
- ```
-
- Add the following environment variable:
-
- ```text
- os.environ["DEMO_KAFKA_BROKERS"] = "feast-release-kafka:9092"
- ```
-
diff --git a/docs/feast-on-kubernetes/getting-started/install-feast/kubernetes-amazon-eks-with-terraform.md b/docs/feast-on-kubernetes/getting-started/install-feast/kubernetes-amazon-eks-with-terraform.md
deleted file mode 100644
index d03d7fb863..0000000000
--- a/docs/feast-on-kubernetes/getting-started/install-feast/kubernetes-amazon-eks-with-terraform.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# Amazon EKS \(with Terraform\)
-
-### Overview
-
-This guide installs Feast on AWS using our [reference Terraform configuration](https://github.com/feast-dev/feast/tree/master/infra/terraform/aws).
-
-{% hint style="info" %}
-The Terraform configuration used here is a greenfield installation that neither assumes anything about, nor integrates with, existing resources in your AWS account. The Terraform configuration presents an easy way to get started, but you may want to customize this set up before using Feast in production.
-{% endhint %}
-
-This Terraform configuration creates the following resources:
-
-* Kubernetes cluster on Amazon EKS \(3x r3.large nodes\)
-* Kafka managed by Amazon MSK \(2x kafka.t3.small nodes\)
-* Postgres database for Feast metadata, using serverless Aurora \(min capacity: 2\)
-* Redis cluster, using Amazon Elasticache \(1x cache.t2.micro\)
-* Amazon EMR cluster to run Spark \(3x spot m4.xlarge\)
-* Staging S3 bucket to store temporary data
-
-![](../../../.gitbook/assets/feast-on-aws-3-%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%283%29.png)
-
-### 1. Requirements
-
-* Create an AWS account and [configure credentials locally](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)
-* Install [Terraform](https://www.terraform.io/) > = 0.12 \(tested with 0.13.3\)
-* Install [Helm](https://helm.sh/docs/intro/install/) \(tested with v3.3.4\)
-
-### 2. Configure Terraform
-
-Create a `.tfvars` file under`feast/infra/terraform/aws`. Name the file. In our example, we use `my_feast.tfvars`. You can see the full list of configuration variables in `variables.tf`. At a minimum, you need to set `name_prefix` and an AWS region:
-
-{% code title="my\_feast.tfvars" %}
-```typescript
-name_prefix = "my-feast"
-region = "us-east-1"
-```
-{% endcode %}
-
-### 3. Apply
-
-After completing the configuration, initialize Terraform and apply:
-
-```bash
-$ cd feast/infra/terraform/aws
-$ terraform init
-$ terraform apply -var-file=my_feast.tfvars
-```
-
-Starting may take a minute. A kubectl configuration file is also created in this directory, and the file's name will start with `kubeconfig_` and end with a random suffix.
-
-### 4. Connect to Feast using Jupyter
-
-After all pods are running, connect to the Jupyter Notebook Server running in the cluster.
-
-To connect to the remote Feast server you just created, forward a port from the remote k8s cluster to your local machine. Replace `kubeconfig_XXXXXXX` below with the kubeconfig file name Terraform generates for you.
-
-```bash
-KUBECONFIG=kubeconfig_XXXXXXX kubectl port-forward \
-$(kubectl get pod -o custom-columns=:metadata.name | grep jupyter) 8888:8888
-```
-
-```text
-Forwarding from 127.0.0.1:8888 -> 8888
-Forwarding from [::1]:8888 -> 8888
-```
-
-You can now connect to the bundled Jupyter Notebook Server at `localhost:8888` and follow the example Jupyter notebook.
-
diff --git a/docs/feast-on-kubernetes/getting-started/install-feast/kubernetes-azure-aks-with-helm.md b/docs/feast-on-kubernetes/getting-started/install-feast/kubernetes-azure-aks-with-helm.md
deleted file mode 100644
index 39dcdbd700..0000000000
--- a/docs/feast-on-kubernetes/getting-started/install-feast/kubernetes-azure-aks-with-helm.md
+++ /dev/null
@@ -1,139 +0,0 @@
-# Azure AKS \(with Helm\)
-
-## Overview
-
-This guide installs Feast on Azure Kubernetes cluster \(known as AKS\), and ensures the following services are running:
-
-* Feast Core
-* Feast Online Serving
-* Postgres
-* Redis
-* Spark
-* Kafka
-* Feast Jupyter \(Optional\)
-* Prometheus \(Optional\)
-
-## 1. Requirements
-
-1. Install and configure [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli)
-2. Install and configure [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
-3. Install [Helm 3](https://helm.sh/)
-
-## 2. Preparation
-
-Create an AKS cluster with Azure CLI. The detailed steps can be found [here](https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough), and a high-level walk through includes:
-
-```bash
-az group create --name myResourceGroup --location eastus
-az acr create --resource-group myResourceGroup --name feast-AKS-ACR --sku Basic
-az aks create -g myResourceGroup -n feast-AKS --location eastus --attach-acr feast-AKS-ACR --generate-ssh-keys
-
-az aks install-cli
-az aks get-credentials --resource-group myResourceGroup --name feast-AKS
-```
-
-Add the Feast Helm repository and download the latest charts:
-
-```bash
-helm version # make sure you have the latest Helm installed
-helm repo add feast-charts https://feast-helm-charts.storage.googleapis.com
-helm repo update
-```
-
-Feast includes a Helm chart that installs all necessary components to run Feast Core, Feast Online Serving, and an example Jupyter notebook.
-
-Feast Core requires Postgres to run, which requires a secret to be set on Kubernetes:
-
-```bash
-kubectl create secret generic feast-postgresql --from-literal=postgresql-password=password
-```
-
-## 3. Feast installation
-
-Install Feast using Helm. The pods may take a few minutes to initialize.
-
-```bash
-helm install feast-release feast-charts/feast
-```
-
-## 4. Spark operator installation
-
-Follow the documentation [to install Spark operator on Kubernetes ](https://github.com/GoogleCloudPlatform/spark-on-k8s-operator), and Feast documentation to [configure Spark roles](../../reference-1/feast-and-spark.md)
-
-```bash
-helm repo add spark-operator https://googlecloudplatform.github.io/spark-on-k8s-operator
-helm install my-release spark-operator/spark-operator --set serviceAccounts.spark.name=spark --set image.tag=v1beta2-1.1.2-2.4.5
-```
-
-and ensure the service account used by Feast has permissions to manage Spark Application resources. This depends on your k8s setup, but typically you'd need to configure a Role and a RoleBinding like the one below:
-
-```text
-cat <
-rules:
-- apiGroups: ["sparkoperator.k8s.io"]
- resources: ["sparkapplications"]
- verbs: ["create", "delete", "deletecollection", "get", "list", "update", "watch", "patch"]
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: RoleBinding
-metadata:
- name: use-spark-operator
- namespace:
-roleRef:
- kind: Role
- name: use-spark-operator
- apiGroup: rbac.authorization.k8s.io
-subjects:
- - kind: ServiceAccount
- name: default
-EOF
-```
-
-## 5. Use Jupyter to connect to Feast
-
-After all the pods are in a `RUNNING` state, port-forward to the Jupyter Notebook Server in the cluster:
-
-```bash
-kubectl port-forward \
-$(kubectl get pod -o custom-columns=:metadata.name | grep jupyter) 8888:8888
-```
-
-```text
-Forwarding from 127.0.0.1:8888 -> 8888
-Forwarding from [::1]:8888 -> 8888
-```
-
-You can now connect to the bundled Jupyter Notebook Server at `localhost:8888` and follow the example Jupyter notebook.
-
-{% embed url="http://localhost:8888/tree?" caption="" %}
-
-## 6. Environment variables
-
-If you are running the [Minimal Ride Hailing Example](https://github.com/feast-dev/feast/blob/master/examples/minimal/minimal_ride_hailing.ipynb), you may want to make sure the following environment variables are correctly set:
-
-```text
-demo_data_location = "wasbs://@.blob.core.windows.net/"
-os.environ["FEAST_AZURE_BLOB_ACCOUNT_NAME"] = ""
-os.environ["FEAST_AZURE_BLOB_ACCOUNT_ACCESS_KEY"] =
-os.environ["FEAST_HISTORICAL_FEATURE_OUTPUT_LOCATION"] = "wasbs://@.blob.core.windows.net/out/"
-os.environ["FEAST_SPARK_STAGING_LOCATION"] = "wasbs://@.blob.core.windows.net/artifacts/"
-os.environ["FEAST_SPARK_LAUNCHER"] = "k8s"
-os.environ["FEAST_SPARK_K8S_NAMESPACE"] = "default"
-os.environ["FEAST_HISTORICAL_FEATURE_OUTPUT_FORMAT"] = "parquet"
-os.environ["FEAST_REDIS_HOST"] = "feast-release-redis-master.default.svc.cluster.local"
-os.environ["DEMO_KAFKA_BROKERS"] = "feast-release-kafka.default.svc.cluster.local:9092"
-```
-
-## 7. Further Reading
-
-* [Feast Concepts](../../concepts/overview.md)
-* [Feast Examples/Tutorials](https://github.com/feast-dev/feast/tree/master/examples)
-* [Feast Helm Chart Documentation](https://github.com/feast-dev/feast/blob/master/infra/charts/feast/README.md)
-* [Configuring Feast components](../../reference-1/configuration-reference.md)
-* [Feast and Spark](../../reference-1/feast-and-spark.md)
-
diff --git a/docs/feast-on-kubernetes/getting-started/install-feast/kubernetes-azure-aks-with-terraform.md b/docs/feast-on-kubernetes/getting-started/install-feast/kubernetes-azure-aks-with-terraform.md
deleted file mode 100644
index 71dd15908d..0000000000
--- a/docs/feast-on-kubernetes/getting-started/install-feast/kubernetes-azure-aks-with-terraform.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# Azure AKS \(with Terraform\)
-
-## Overview
-
-This guide installs Feast on Azure using our [reference Terraform configuration](https://github.com/feast-dev/feast/tree/master/infra/terraform/azure).
-
-{% hint style="info" %}
-The Terraform configuration used here is a greenfield installation that neither assumes anything about, nor integrates with, existing resources in your Azure account. The Terraform configuration presents an easy way to get started, but you may want to customize this set up before using Feast in production.
-{% endhint %}
-
-This Terraform configuration creates the following resources:
-
-* Kubernetes cluster on Azure AKS
-* Kafka managed by HDInsight
-* Postgres database for Feast metadata, running as a pod on AKS
-* Redis cluster, using Azure Cache for Redis
-* [spark-on-k8s-operator](https://github.com/GoogleCloudPlatform/spark-on-k8s-operator) to run Spark
-* Staging Azure blob storage container to store temporary data
-
-## 1. Requirements
-
-* Create an Azure account and [configure credentials locally](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli)
-* Install [Terraform](https://www.terraform.io/) \(tested with 0.13.5\)
-* Install [Helm](https://helm.sh/docs/intro/install/) \(tested with v3.4.2\)
-
-## 2. Configure Terraform
-
-Create a `.tfvars` file under`feast/infra/terraform/azure`. Name the file. In our example, we use `my_feast.tfvars`. You can see the full list of configuration variables in `variables.tf`. At a minimum, you need to set `name_prefix` and `resource_group`:
-
-{% code title="my\_feast.tfvars" %}
-```typescript
-name_prefix = "feast"
-resource_group = "Feast" # pre-existing resource group
-```
-{% endcode %}
-
-## 3. Apply
-
-After completing the configuration, initialize Terraform and apply:
-
-```bash
-$ cd feast/infra/terraform/azure
-$ terraform init
-$ terraform apply -var-file=my_feast.tfvars
-```
-
-## 4. Connect to Feast using Jupyter
-
-After all pods are running, connect to the Jupyter Notebook Server running in the cluster.
-
-To connect to the remote Feast server you just created, forward a port from the remote k8s cluster to your local machine.
-
-```bash
-kubectl port-forward $(kubectl get pod -o custom-columns=:metadata.name | grep jupyter) 8888:8888
-```
-
-```text
-Forwarding from 127.0.0.1:8888 -> 8888
-Forwarding from [::1]:8888 -> 8888
-```
-
-You can now connect to the bundled Jupyter Notebook Server at `localhost:8888` and follow the example Jupyter notebook.
-
diff --git a/docs/feast-on-kubernetes/getting-started/install-feast/kubernetes-with-helm.md b/docs/feast-on-kubernetes/getting-started/install-feast/kubernetes-with-helm.md
deleted file mode 100644
index 032554d120..0000000000
--- a/docs/feast-on-kubernetes/getting-started/install-feast/kubernetes-with-helm.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# Kubernetes \(with Helm\)
-
-## Overview
-
-This guide installs Feast on an existing Kubernetes cluster, and ensures the following services are running:
-
-* Feast Core
-* Feast Online Serving
-* Postgres
-* Redis
-* Feast Jupyter \(Optional\)
-* Prometheus \(Optional\)
-
-## 1. Requirements
-
-1. Install and configure [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
-2. Install [Helm 3](https://helm.sh/)
-
-## 2. Preparation
-
-Add the Feast Helm repository and download the latest charts:
-
-```text
-helm repo add feast-charts https://feast-helm-charts.storage.googleapis.com
-helm repo update
-```
-
-Feast includes a Helm chart that installs all necessary components to run Feast Core, Feast Online Serving, and an example Jupyter notebook.
-
-Feast Core requires Postgres to run, which requires a secret to be set on Kubernetes:
-
-```bash
-kubectl create secret generic feast-postgresql --from-literal=postgresql-password=password
-```
-
-## 3. Installation
-
-Install Feast using Helm. The pods may take a few minutes to initialize.
-
-```bash
-helm install feast-release feast-charts/feast
-```
-
-## 4. Use Jupyter to connect to Feast
-
-After all the pods are in a `RUNNING` state, port-forward to the Jupyter Notebook Server in the cluster:
-
-```bash
-kubectl port-forward \
-$(kubectl get pod -l app=feast-jupyter -o custom-columns=:metadata.name) 8888:8888
-```
-
-```text
-Forwarding from 127.0.0.1:8888 -> 8888
-Forwarding from [::1]:8888 -> 8888
-```
-
-You can now connect to the bundled Jupyter Notebook Server at `localhost:8888` and follow the example Jupyter notebook.
-
-{% embed url="http://localhost:8888/tree?" caption="" %}
-
-## 5. Further Reading
-
-* [Feast Concepts](../../concepts/overview.md)
-* [Feast Examples/Tutorials](https://github.com/feast-dev/feast/tree/master/examples)
-* [Feast Helm Chart Documentation](https://github.com/feast-dev/feast/blob/master/infra/charts/feast/README.md)
-* [Configuring Feast components](../../reference-1/configuration-reference.md)
-* [Feast and Spark](../../reference-1/feast-and-spark.md)
-
diff --git a/docs/feast-on-kubernetes/getting-started/install-feast/quickstart.md b/docs/feast-on-kubernetes/getting-started/install-feast/quickstart.md
deleted file mode 100644
index b5e50d193c..0000000000
--- a/docs/feast-on-kubernetes/getting-started/install-feast/quickstart.md
+++ /dev/null
@@ -1,91 +0,0 @@
-# Docker Compose
-
-{% hint style="success" %}
-This guide is meant for exploratory purposes only. It allows users to run Feast locally using Docker Compose instead of Kubernetes. The goal of this guide is for users to be able to quickly try out the full Feast stack without needing to deploy to Kubernetes. It is not meant for production use.
-{% endhint %}
-
-## Overview
-
-This guide shows you how to deploy Feast using [Docker Compose](https://docs.docker.com/get-started/). Docker Compose allows you to explore the functionality provided by Feast while requiring only minimal infrastructure.
-
-This guide includes the following containerized components:
-
-* [A complete Feast deployment](../../concepts/architecture.md)
- * Feast Core with Postgres
- * Feast Online Serving with Redis.
- * Feast Job Service
-* A Jupyter Notebook Server with built in Feast example\(s\). For demo purposes only.
-* A Kafka cluster for testing streaming ingestion. For demo purposes only.
-
-## Get Feast
-
-Clone the latest stable version of Feast from the [Feast repository](https://github.com/feast-dev/feast/):
-
-```text
-git clone https://github.com/feast-dev/feast.git
-cd feast/infra/docker-compose
-```
-
-Create a new configuration file:
-
-```text
-cp .env.sample .env
-```
-
-## Start Feast
-
-Start Feast with Docker Compose:
-
-```text
-docker-compose pull && docker-compose up -d
-```
-
-Wait until all all containers are in a running state:
-
-```text
-docker-compose ps
-```
-
-## Try our example\(s\)
-
-You can now connect to the bundled Jupyter Notebook Server running at `localhost:8888` and follow the example Jupyter notebook.
-
-{% embed url="http://localhost:8888/tree?" caption="" %}
-
-## Troubleshooting
-
-### Open ports
-
-Please ensure that the following ports are available on your host machine:
-
-* `6565`
-* `6566`
-* `8888`
-* `9094`
-* `5432`
-
-If a port conflict cannot be resolved, you can modify the port mappings in the provided [docker-compose.yml](https://github.com/feast-dev/feast/tree/master/infra/docker-compose) file to use different ports on the host.
-
-### Containers are restarting or unavailable
-
-If some of the containers continue to restart, or you are unable to access a service, inspect the logs using the following command:
-
-```javascript
-docker-compose logs -f -t
-```
-
-If you are unable to resolve the problem, visit [GitHub](https://github.com/feast-dev/feast/issues) to create an issue.
-
-## Configuration
-
-The Feast Docker Compose setup can be configured by modifying properties in your `.env` file.
-
-### Accessing Google Cloud Storage \(GCP\)
-
-To access Google Cloud Storage as a data source, the Docker Compose installation requires access to a GCP service account.
-
-* Create a new [service account](https://cloud.google.com/iam/docs/creating-managing-service-accounts) and save a JSON key.
-* Grant the service account access to your bucket\(s\).
-* Copy the service account to the path you have configured in `.env` under `GCP_SERVICE_ACCOUNT`.
-* Restart your Docker Compose setup of Feast.
-
diff --git a/docs/feast-on-kubernetes/getting-started/learn-feast.md b/docs/feast-on-kubernetes/getting-started/learn-feast.md
deleted file mode 100644
index 983799ca9b..0000000000
--- a/docs/feast-on-kubernetes/getting-started/learn-feast.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Learn Feast
-
-Explore the following resources to learn more about Feast:
-
-* [Concepts](../../) describes all important Feast API concepts.
-* [User guide](../user-guide/define-and-ingest-features.md) provides guidance on completing Feast workflows.
-* [Examples](https://github.com/feast-dev/feast/tree/master/examples) contains Jupyter notebooks that you can run on your Feast deployment.
-* [Advanced](../advanced-1/troubleshooting.md) contains information about both advanced and operational aspects of Feast.
-* [Reference](../reference-1/api/) contains detailed API and design documents for advanced users.
-* [Contributing](../../contributing/contributing.md) contains resources for anyone who wants to contribute to Feast.
-
-{% hint style="info" %}
-The best way to learn Feast is to use it. Jump over to our [Quickstart](install-feast/quickstart.md) guide to have one of our examples running in no time at all!
-{% endhint %}
-
diff --git a/docs/feast-on-kubernetes/reference-1/README.md b/docs/feast-on-kubernetes/reference-1/README.md
deleted file mode 100644
index 02577ad8e3..0000000000
--- a/docs/feast-on-kubernetes/reference-1/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Reference
-
diff --git a/docs/feast-on-kubernetes/reference-1/api/README.md b/docs/feast-on-kubernetes/reference-1/api/README.md
deleted file mode 100644
index cd75f5bf88..0000000000
--- a/docs/feast-on-kubernetes/reference-1/api/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# API Reference
-
-Please see the following API specific reference documentation:
-
-* [Feast Core gRPC API](https://api.docs.feast.dev/grpc/feast/core/coreservice.pb.html): This is the gRPC API used by Feast Core. This API contains RPCs for creating and managing feature sets, stores, projects, and jobs.
-* [Feast Serving gRPC API](https://api.docs.feast.dev/grpc/feast/serving/servingservice.pb.html): This is the gRPC API used by Feast Serving. It contains RPCs used for the retrieval of online feature data or historical feature data.
-* [Feast gRPC Types](https://api.docs.feast.dev/grpc/feast/types/value.pb): These are the gRPC types used by both Feast Core, Feast Serving, and the Go, Java, and Python clients.
-* [Go Client SDK](https://godoc.org/github.com/feast-dev/feast/sdk/go): The Go library used for the retrieval of online features from Feast.
-* [Java Client SDK](https://javadoc.io/doc/dev.feast/feast-sdk): The Java library used for the retrieval of online features from Feast.
-* [Python SDK](https://api.docs.feast.dev/python/): This is the complete reference to the Feast Python SDK. The SDK is used to manage feature sets, features, jobs, projects, and entities. It can also be used to retrieve training datasets or online features from Feast Serving.
-
-## Community Contributions
-
-The following community provided SDKs are available:
-
-* [Node.js SDK](https://github.com/MichaelHirn/feast-client/): A Node.js SDK written in TypeScript. The SDK can be used to manage feature sets, features, jobs, projects, and entities.
-
diff --git a/docs/feast-on-kubernetes/reference-1/configuration-reference.md b/docs/feast-on-kubernetes/reference-1/configuration-reference.md
deleted file mode 100644
index 6f9a97dabf..0000000000
--- a/docs/feast-on-kubernetes/reference-1/configuration-reference.md
+++ /dev/null
@@ -1,132 +0,0 @@
-# Configuration Reference
-
-## Overview
-
-This reference describes how to configure Feast components:
-
-* [Feast Core and Feast Online Serving](configuration-reference.md#2-feast-core-serving-and-job-controller)
-* [Feast CLI and Feast Python SDK](configuration-reference.md#3-feast-cli-and-feast-python-sdk)
-* [Feast Go and Feast Java SDK](configuration-reference.md#4-feast-java-and-go-sdk)
-
-## 1. Feast Core and Feast Online Serving
-
-Available configuration properties for Feast Core and Feast Online Serving can be referenced from the corresponding `application.yml` of each component:
-
-| Component | Configuration Reference |
-| :--- | :--- |
-| Core | [core/src/main/resources/application.yml](https://github.com/feast-dev/feast-java/blob/master/core/src/main/resources/application.yml) |
-| Serving \(Online\) | [serving/src/main/resources/application.yml](https://github.com/feast-dev/feast-java/blob/master/serving/src/main/resources/application.yml) |
-
-Configuration properties for Feast Core and Feast Online Serving are defined depending on Feast is deployed:
-
-* [Docker Compose deployment](configuration-reference.md#docker-compose-deployment) - Feast is deployed with Docker Compose.
-* [Kubernetes deployment](configuration-reference.md#kubernetes-deployment) - Feast is deployed with Kubernetes.
-* [Direct Configuration](configuration-reference.md#direct-configuration) - Feast is built and run from source code.
-
-## Docker Compose Deployment
-
-For each Feast component deployed using Docker Compose, configuration properties from `application.yml` can be set at:
-
-| Component | Configuration Path |
-| :--- | :--- |
-| Core | `infra/docker-compose/core/core.yml` |
-| Online Serving | `infra/docker-compose/serving/online-serving.yml` |
-
-## Kubernetes Deployment
-
-The Kubernetes Feast Deployment is configured using `values.yaml` in the [Helm chart](https://github.com/feast-dev/feast-helm-charts) included with Feast:
-
-```yaml
-# values.yaml
-feast-core:
- enabled: true # whether to deploy the feast-core subchart to deploy Feast Core.
- # feast-core subchart specific config.
- gcpServiceAccount:
- enabled: true
- # ....
-```
-
-A reference of the sub-chart-specific configuration can found in its `values.yml`:
-
-* [feast-core](https://github.com/feast-dev/feast-java/tree/master/infra/charts/feast-core)
-* [feast-serving](https://github.com/feast-dev/feast-java/tree/master/infra/charts/feast-serving)
-
-Configuration properties can be set via `application-override.yaml` for each component in `values.yaml`:
-
-```yaml
-# values.yaml
-feast-core:
- # ....
- application-override.yaml:
- # application.yml config properties for Feast Core.
- # ...
-```
-
-Visit the [Helm chart](https://github.com/feast-dev/feast-helm-charts) included with Feast to learn more about configuration.
-
-## Direct Configuration
-
-If Feast is built and running from source, configuration properties can be set directly in the Feast component's `application.yml`:
-
-| Component | Configuration Path |
-| :--- | :--- |
-| Core | [core/src/main/resources/application.yml](https://github.com/feast-dev/feast-java/blob/master/core/src/main/resources/application.yml) |
-| Serving \(Online\) | [serving/src/main/resources/application.yml](https://github.com/feast-dev/feast-java/blob/master/serving/src/main/resources/application.yml) |
-
-## 2. Feast CLI and Feast Python SDK
-
-Configuration options for both the [Feast CLI](../getting-started/connect-to-feast/feast-cli.md) and [Feast Python SDK](https://api.docs.feast.dev/python/) can be defined in the following locations, in order of precedence:
-
-**1. Command line arguments or initialized arguments:** Passing parameters to the Feast CLI or instantiating the Feast Client object with specific parameters will take precedence above other parameters.
-
-```bash
-# Set option as command line arguments.
-feast config set core_url "localhost:6565"
-```
-
-```python
-# Pass options as initialized arguments.
-client = Client(
- core_url="localhost:6565",
- project="default"
-)
-```
-
-**2. Environmental variables:** Environmental variables can be set to provide configuration options. They must be prefixed with `FEAST_`. For example `FEAST_CORE_URL`.
-
-```bash
-FEAST_CORE_URL=my_feast:6565 FEAST_PROJECT=default feast projects list
-```
-
-**3. Configuration file:** Options with the lowest precedence are configured in the Feast configuration file. Feast looks for or creates this configuration file in `~/.feast/config` if it does not already exist. All options must be defined in the `[general]` section of this file.
-
-```text
-[general]
-project = default
-core_url = localhost:6565
-```
-
-Visit the [available configuration parameters](https://api.docs.feast.dev/python/#module-feast.constants) for Feast Python SDK and Feast CLI to learn more.
-
-## 3. Feast Java and Go SDK
-
-The [Feast Java SDK](https://javadoc.io/doc/dev.feast/feast-sdk/latest/com/gojek/feast/package-summary.html) and [Feast Go SDK](https://godoc.org/github.com/feast-dev/feast/sdk/go) are configured via arguments passed when instantiating the respective Clients:
-
-### Go SDK
-
-```go
-// configure serving host and port.
-cli := feast.NewGrpcClient("localhost", 6566)
-```
-
-Visit the[ Feast Go SDK API reference](https://godoc.org/github.com/feast-dev/feast/sdk/go) to learn more about available configuration parameters.
-
-### Java SDK
-
-```java
-// configure serving host and port.
-client = FeastClient.create(servingHost, servingPort);
-```
-
-Visit the [Feast Java SDK API reference](https://javadoc.io/doc/dev.feast/feast-sdk/latest/com/gojek/feast/package-summary.html) to learn more about available configuration parameters.
-
diff --git a/docs/feast-on-kubernetes/reference-1/feast-and-spark.md b/docs/feast-on-kubernetes/reference-1/feast-and-spark.md
deleted file mode 100644
index be05f177ae..0000000000
--- a/docs/feast-on-kubernetes/reference-1/feast-and-spark.md
+++ /dev/null
@@ -1,83 +0,0 @@
----
-description: Configuring Feast to use Spark for ingestion.
----
-
-# Feast and Spark
-
-Feast relies on Spark to ingest data from the offline store to the online store, streaming ingestion, and running queries to retrieve historical data from the offline store. Feast supports several Spark deployment options.
-
-## Option 1. Use Kubernetes Operator for Apache Spark
-
-To install the Spark on K8s Operator
-
-```bash
-helm repo add spark-operator \
- https://googlecloudplatform.github.io/spark-on-k8s-operator
-
-helm install my-release spark-operator/spark-operator \
- --set serviceAccounts.spark.name=spark
-```
-
-Currently Feast is tested using `v1beta2-1.1.2-2.4.5`version of the operator image. To configure Feast to use it, set the following options in Feast config:
-
-| Feast Setting | Value |
-| :--- | :--- |
-| `SPARK_LAUNCHER` | `"k8s"` |
-| `SPARK_STAGING_LOCATION` | S3/GCS/Azure Blob Storage URL to use as a staging location, must be readable and writable by Feast. For S3, use `s3a://` prefix here. Ex.: `s3a://some-bucket/some-prefix/artifacts/` |
-| `HISTORICAL_FEATURE_OUTPUT_LOCATION` | S3/GCS/Azure Blob Storage URL used to store results of historical retrieval queries, must be readable and writable by Feast. For S3, use `s3a://` prefix here. Ex.: `s3a://some-bucket/some-prefix/out/` |
-| `SPARK_K8S_NAMESPACE` | Only needs to be set if you are customizing the spark-on-k8s-operator. The name of the Kubernetes namespace to run Spark jobs in. This should match the value of `sparkJobNamespace` set on spark-on-k8s-operator Helm chart. Typically this is also the namespace Feast itself will run in. |
-| `SPARK_K8S_JOB_TEMPLATE_PATH` | Only needs to be set if you are customizing the Spark job template. Local file path with the template of the SparkApplication resource. No prefix required. Ex.: `/home/jovyan/work/sparkapp-template.yaml`. An example template is [here](https://github.com/feast-dev/feast/blob/4059a21dc4eba9cd27b2d5b0fabe476c07a8b3bd/sdk/python/feast/pyspark/launchers/k8s/k8s_utils.py#L280-L317) and the spec is defined in the [k8s-operator User Guide](https://github.com/GoogleCloudPlatform/spark-on-k8s-operator/blob/master/docs/user-guide.md). |
-
-Lastly, make sure that the service account used by Feast has permissions to manage Spark Application resources. This depends on your k8s setup, but typically you'd need to configure a Role and a RoleBinding like the one below:
-
-```text
-cat <
-
-
-
Limitation
-
Motivation
-
-
-
-
-
Features names and entity names cannot overlap in feature table definitions
-
Features and entities become columns in historical stores which may cause
- conflicts
-
-
-
-
The following field names are reserved in feature tables
-
-
event_timestamp
-
-
datetime
-
-
created_timestamp
-
-
ingestion_id
-
-
job_id
-
-
-
-
These keywords are used for column names when persisting metadata in historical
- stores
-
-
-
-
-### Ingestion
-
-| Limitation | Motivation |
-| :--- | :--- |
-| Once data has been ingested into Feast, there is currently no way to delete the data without manually going to the database and deleting it. However, during retrieval only the latest rows will be returned for a specific key \(`event_timestamp`, `entity`\) based on its `created_timestamp`. | This functionality simply doesn't exist yet as a Feast API |
-
-### Storage
-
-| Limitation | Motivation |
-| :--- | :--- |
-| Feast does not support offline storage in Feast 0.8 | As part of our re-architecture of Feast, we moved from GCP to cloud-agnostic deployments. Developing offline storage support that is available in all cloud environments is a pending action. |
-
diff --git a/docs/feast-on-kubernetes/reference-1/metrics-reference.md b/docs/feast-on-kubernetes/reference-1/metrics-reference.md
deleted file mode 100644
index 78f94bc390..0000000000
--- a/docs/feast-on-kubernetes/reference-1/metrics-reference.md
+++ /dev/null
@@ -1,178 +0,0 @@
-# Metrics Reference
-
-{% hint style="warning" %}
-This page applies to Feast 0.7. The content may be out of date for Feast 0.8+
-{% endhint %}
-
-Reference of the metrics that each Feast component exports:
-
-* [Feast Core](metrics-reference.md#feast-core)
-* [Feast Serving](metrics-reference.md#feast-serving)
-* [Feast Ingestion Job](metrics-reference.md#feast-ingestion-job)
-
-For how to configure Feast to export Metrics, see the [Metrics user guide.](../advanced-1/metrics.md)
-
-## Feast Core
-
-**Exported Metrics**
-
-Feast Core exports the following metrics:
-
-| Metrics | Description | Tags |
-| :--- | :--- | :--- |
-| `feast_core_request_latency_seconds` | Feast Core's latency in serving Requests in Seconds. | `service`, `method`, `status_code` |
-| `feast_core_feature_set_total` | No. of Feature Sets registered with Feast Core. | None |
-| `feast_core_store_total` | No. of Stores registered with Feast Core. | None |
-| `feast_core_max_memory_bytes` | Max amount of memory the Java virtual machine will attempt to use. | None |
-| `feast_core_total_memory_bytes` | Total amount of memory in the Java virtual machine | None |
-| `feast_core_free_memory_bytes` | Total amount of free memory in the Java virtual machine. | None |
-| `feast_core_gc_collection_seconds` | Time spent in a given JVM garbage collector in seconds. | None |
-
-**Metric Tags**
-
-Exported Feast Core metrics may be filtered by the following tags/keys
-
-| Tag | Description |
-| :--- | :--- |
-| `service` | Name of the Service that request is made to. Should be set to `CoreService` |
-| `method` | Name of the Method that the request is calling. \(ie `ListFeatureSets`\) |
-| `status_code` | Status code returned as a result of handling the requests \(ie `OK`\). Can be used to find request failures. |
-
-## Feast Serving
-
-**Exported Metrics**
-
-Feast Serving exports the following metrics:
-
-| Metric | Description | Tags |
-| :--- | :--- | :--- |
-| `feast_serving_request_latency_seconds` | Feast Serving's latency in serving Requests in Seconds. | `method` |
-| `feast_serving_request_feature_count` | No. of requests retrieving a Feature from Feast Serving. | `project`, `feature_name` |
-| `feast_serving_not_found_feature_count` | No. of requests retrieving a Feature has resulted in a [`NOT_FOUND` field status.](../user-guide/getting-training-features.md#online-field-statuses) | `project`, `feature_name` |
-| `feast_serving_stale_feature_count` | No. of requests retrieving a Feature resulted in a [`OUTSIDE_MAX_AGE` field status.](../user-guide/getting-training-features.md#online-field-statuses) | `project`, `feature_name` |
-| `feast_serving_grpc_request_count` | Total gRPC requests served. | `method` |
-
-**Metric Tags**
-
-Exported Feast Serving metrics may be filtered by the following tags/keys
-
-| Tag | Description |
-| :--- | :--- |
-| `method` | Name of the Method that the request is calling. \(ie `ListFeatureSets`\) |
-| `status_code` | Status code returned as a result of handling the requests \(ie `OK`\). Can be used to find request failures. |
-| `project` | Name of the project that the FeatureSet of the Feature retrieved belongs to. |
-| `feature_name` | Name of the Feature being retrieved. |
-
-## Feast Ingestion Job
-
-Feast Ingestion computes both metrics an statistics on [data ingestion.](../user-guide/define-and-ingest-features.md) Make sure you familar with data ingestion concepts before proceeding.
-
-**Metrics Namespace**
-
-Metrics are computed at two stages of the Feature Row's/Feature Value's life cycle when being processed by the Ingestion Job:
-
-* `Inflight`- Prior to writing data to stores, but after successful validation of data.
-* `WriteToStoreSucess`- After a successful store write.
-
-Metrics processed by each staged will be tagged with `metrics_namespace` to the stage where the metric was computed.
-
-**Metrics Bucketing**
-
-Metrics with a `{BUCKET}` are computed on a 60 second window/bucket. Suffix with the following to select the bucket to use:
-
-* `min` - minimum value.
-* `max` - maximum value.
-* `mean`- mean value.
-* `percentile_90`- 90 percentile.
-* `percentile_95`- 95 percentile.
-* `percentile_99`- 99 percentile.
-
-**Exported Metrics**
-
-
-
-
-
Metric
-
Description
-
Tags
-
-
-
-
-
feast_ingestion_feature_row_lag_ms_{BUCKET}
-
-
Lag time in milliseconds between succeeding ingested Feature Rows.
-
-**Metric Tags**
-
-Exported Feast Ingestion Job metrics may be filtered by the following tags/keys
-
-| Tag | Description |
-| :--- | :--- |
-| `feast_store` | Name of the target store the Ingestion Job is writing to. |
-| `feast_project_name` | Name of the project that the ingested FeatureSet belongs to. |
-| `feast_featureSet_name` | Name of the Feature Set being ingested. |
-| `feast_feature_name` | Name of the Feature being ingested. |
-| `ingestion_job_name` | Name of the Ingestion Job performing data ingestion. Typically this is set to the Id of the Ingestion Job. |
-| `metrics_namespace` | Stage where metrics where computed. Either `Inflight` or `WriteToStoreSuccess` |
-
diff --git a/docs/feast-on-kubernetes/tutorials-1/README.md b/docs/feast-on-kubernetes/tutorials-1/README.md
deleted file mode 100644
index 84ce15b788..0000000000
--- a/docs/feast-on-kubernetes/tutorials-1/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Tutorials
-
diff --git a/docs/feast-on-kubernetes/user-guide/README.md b/docs/feast-on-kubernetes/user-guide/README.md
deleted file mode 100644
index be02a73372..0000000000
--- a/docs/feast-on-kubernetes/user-guide/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# User guide
-
diff --git a/docs/feast-on-kubernetes/user-guide/define-and-ingest-features.md b/docs/feast-on-kubernetes/user-guide/define-and-ingest-features.md
deleted file mode 100644
index 5a7e7288ec..0000000000
--- a/docs/feast-on-kubernetes/user-guide/define-and-ingest-features.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# Define and ingest features
-
-In order to retrieve features for both training and serving, Feast requires data being ingested into its offline and online stores.
-
-Users are expected to already have either a batch or stream source with data stored in it, ready to be ingested into Feast. Once a feature table \(with the corresponding sources\) has been registered with Feast, it is possible to load data from this source into stores.
-
-The following depicts an example ingestion flow from a data source to the online store.
-
-## Batch Source to Online Store
-
-```python
-from feast import Client
-from datetime import datetime, timedelta
-
-client = Client(core_url="localhost:6565")
-driver_ft = client.get_feature_table("driver_trips")
-
-# Initialize date ranges
-today = datetime.now()
-yesterday = today - timedelta(1)
-
-# Launches a short-lived job that ingests data over the provided date range.
-client.start_offline_to_online_ingestion(
- driver_ft, yesterday, today
-)
-```
-
-## Stream Source to Online Store
-
-```python
-from feast import Client
-from datetime import datetime, timedelta
-
-client = Client(core_url="localhost:6565")
-driver_ft = client.get_feature_table("driver_trips")
-
-# Launches a long running streaming ingestion job
-client.start_stream_to_online_ingestion(driver_ft)
-```
-
-## Batch Source to Offline Store
-
-{% hint style="danger" %}
-Not supported in Feast 0.8
-{% endhint %}
-
-## Stream Source to Offline Store
-
-{% hint style="danger" %}
-Not supported in Feast 0.8
-{% endhint %}
-
diff --git a/docs/feast-on-kubernetes/user-guide/getting-online-features.md b/docs/feast-on-kubernetes/user-guide/getting-online-features.md
deleted file mode 100644
index c16dc08a01..0000000000
--- a/docs/feast-on-kubernetes/user-guide/getting-online-features.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# Getting online features
-
-Feast provides an API through which online feature values can be retrieved. This allows teams to look up feature values at low latency in production during model serving, in order to make online predictions.
-
-{% hint style="info" %}
-Online stores only maintain the current state of features, i.e latest feature values. No historical data is stored or served.
-{% endhint %}
-
-```python
-from feast import Client
-
-online_client = Client(
- core_url="localhost:6565",
- serving_url="localhost:6566",
-)
-
-entity_rows = [
- {"driver_id": 1001},
- {"driver_id": 1002},
-]
-
-# Features in format
-feature_refs = [
- "driver_trips:average_daily_rides",
- "driver_trips:maximum_daily_rides",
- "driver_trips:rating",
-]
-
-response = online_client.get_online_features(
- feature_refs=feature_refs, # Contains only feature references
- entity_rows=entity_rows, # Contains only entities (driver ids)
-)
-
-# Print features in dictionary format
-response_dict = response.to_dict()
-print(response_dict)
-```
-
-The online store must be populated through [ingestion jobs](define-and-ingest-features.md#batch-source-to-online-store) prior to being used for online serving.
-
-Feast Serving provides a [gRPC API](https://api.docs.feast.dev/grpc/feast.serving.pb.html) that is backed by [Redis](https://redis.io/). We have native clients in [Python](https://api.docs.feast.dev/python/), [Go](https://godoc.org/github.com/gojek/feast/sdk/go), and [Java](https://javadoc.io/doc/dev.feast).
-
-### Online Field Statuses
-
-Feast also returns status codes when retrieving features from the Feast Serving API. These status code give useful insight into the quality of data being served.
-
-| Status | Meaning |
-| :--- | :--- |
-| NOT\_FOUND | The feature value was not found in the online store. This might mean that no feature value was ingested for this feature. |
-| NULL\_VALUE | A entity key was successfully found but no feature values had been set. This status code should not occur during normal operation. |
-| OUTSIDE\_MAX\_AGE | The age of the feature row in the online store \(in terms of its event timestamp\) has exceeded the maximum age defined within the feature table. |
-| PRESENT | The feature values have been found and are within the maximum age. |
-| UNKNOWN | Indicates a system failure. |
-
diff --git a/docs/feast-on-kubernetes/user-guide/getting-training-features.md b/docs/feast-on-kubernetes/user-guide/getting-training-features.md
deleted file mode 100644
index e0f52a8cd9..0000000000
--- a/docs/feast-on-kubernetes/user-guide/getting-training-features.md
+++ /dev/null
@@ -1,72 +0,0 @@
-# Getting training features
-
-Feast provides a historical retrieval interface for exporting feature data in order to train machine learning models. Essentially, users are able to enrich their data with features from any feature tables.
-
-### Retrieving historical features
-
-Below is an example of the process required to produce a training dataset:
-
-```python
-# Feature references with target feature
-features = [
- "driver_trips:average_daily_rides",
- "driver_trips:maximum_daily_rides",
- "driver_trips:rating",
- "driver_trips:rating:trip_completed",
-]
-
-# Define entity source
-entity_source = FileSource(
- "event_timestamp",
- ParquetFormat(),
- "gs://some-bucket/customer"
-)
-
-# Retrieve historical dataset from Feast.
-historical_feature_retrieval_job = client.get_historical_features(
- features=features,
- entity_rows=entity_source
-)
-
-output_file_uri = historical_feature_retrieval_job.get_output_file_uri()
-```
-
-#### 1. Define feature references
-
-[Feature references]() define the specific features that will be retrieved from Feast. These features can come from multiple feature tables. The only requirement is that the feature tables that make up the feature references have the same entity \(or composite entity\).
-
-**2. Define an entity dataframe**
-
-Feast needs to join feature values onto specific entities at specific points in time. Thus, it is necessary to provide an [entity dataframe]() as part of the `get_historical_features` method. In the example above we are defining an entity source. This source is an external file that provides Feast with the entity dataframe.
-
-**3. Launch historical retrieval job**
-
-Once the feature references and an entity source are defined, it is possible to call `get_historical_features()`. This method launches a job that extracts features from the sources defined in the provided feature tables, joins them onto the provided entity source, and returns a reference to the training dataset that is produced.
-
-Please see the [Feast SDK](https://api.docs.feast.dev/python) for more details.
-
-### Point-in-time Joins
-
-Feast always joins features onto entity data in a point-in-time correct way. The process can be described through an example.
-
-In the example below there are two tables \(or dataframes\):
-
-* The dataframe on the left is the [entity dataframe]() that contains timestamps, entities, and the target variable \(trip\_completed\). This dataframe is provided to Feast through an entity source.
-* The dataframe on the right contains driver features. This dataframe is represented in Feast through a feature table and its accompanying data source\(s\).
-
-The user would like to have the driver features joined onto the entity dataframe to produce a training dataset that contains both the target \(trip\_completed\) and features \(average\_daily\_rides, maximum\_daily\_rides, rating\). This dataset will then be used to train their model.
-
-![](../../.gitbook/assets/point_in_time_join%20%281%29%20%282%29%20%282%29%20%283%29%20%283%29%20%283%29%20%283%29%20%282%29.png)
-
-Feast is able to intelligently join feature data with different timestamps to a single entity dataframe. It does this through a point-in-time join as follows:
-
-1. Feast loads the entity dataframe and all feature tables \(driver dataframe\) into the same location. This can either be a database or in memory.
-2. For each [entity row]() in the [entity dataframe](getting-online-features.md), Feast tries to find feature values in each feature table to join to it. Feast extracts the timestamp and entity key of each row in the entity dataframe and scans backward through the feature table until it finds a matching entity key.
-3. If the event timestamp of the matching entity key within the driver feature table is within the maximum age configured for the feature table, then the features at that entity key are joined onto the entity dataframe. If the event timestamp is outside of the maximum age, then only null values are returned.
-4. If multiple entity keys are found with the same event timestamp, then they are deduplicated by the created timestamp, with newer values taking precedence.
-5. Feast repeats this joining process for all feature tables and returns the resulting dataset.
-
-{% hint style="info" %}
-Point-in-time correct joins attempts to prevent the occurrence of feature leakage by trying to recreate the state of the world at a single point in time, instead of joining features based on exact timestamps only.
-{% endhint %}
-
diff --git a/docs/feast-on-kubernetes/user-guide/overview.md b/docs/feast-on-kubernetes/user-guide/overview.md
deleted file mode 100644
index 5f36792479..0000000000
--- a/docs/feast-on-kubernetes/user-guide/overview.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# Overview
-
-### Using Feast
-
-Feast development happens through three key workflows:
-
-1. [Define and load feature data into Feast](define-and-ingest-features.md)
-2. [Retrieve historical features for training models](getting-training-features.md)
-3. [Retrieve online features for serving models](getting-online-features.md)
-
-### Defining feature tables and ingesting data into Feast
-
-Feature creators model the data within their organization into Feast through the definition of [feature tables](../concepts/feature-tables.md) that contain [data sources](../concepts/sources.md). Feature tables are both a schema and a means of identifying data sources for features, and allow Feast to know how to interpret your data, and where to find it.
-
-After registering a feature table with Feast, users can trigger an ingestion from their data source into Feast. This loads feature values from an upstream data source into Feast stores through ingestion jobs.
-
-Visit [feature tables](../concepts/feature-tables.md#overview) to learn more about them.
-
-{% page-ref page="define-and-ingest-features.md" %}
-
-### Retrieving historical features for training
-
-In order to generate a training dataset it is necessary to provide both an [entity dataframe ]()and feature references through the[ Feast SDK](https://api.docs.feast.dev/python/) to retrieve historical features. For historical serving, Feast requires that you provide the entities and timestamps for the corresponding feature data. Feast produces a point-in-time correct dataset using the requested features. These features can be requested from an unlimited number of feature sets.
-
-{% page-ref page="getting-training-features.md" %}
-
-### Retrieving online features for online serving
-
-Online retrieval uses feature references through the [Feast Online Serving API](https://api.docs.feast.dev/grpc/feast.serving.pb.html) to retrieve online features. Online serving allows for very low latency requests to feature data at very high throughput.
-
-{% page-ref page="getting-online-features.md" %}
-
diff --git a/docs/feature-views.md b/docs/feature-views.md
deleted file mode 100644
index 235b828835..0000000000
--- a/docs/feature-views.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Feature Views
-
diff --git a/docs/getting-started/architecture-and-components/untitled.md b/docs/getting-started/architecture-and-components/registry.md
similarity index 100%
rename from docs/getting-started/architecture-and-components/untitled.md
rename to docs/getting-started/architecture-and-components/registry.md
diff --git a/docs/getting-started/concepts/README.md b/docs/getting-started/concepts/README.md
index 99ff586186..7ad0115a72 100644
--- a/docs/getting-started/concepts/README.md
+++ b/docs/getting-started/concepts/README.md
@@ -14,3 +14,4 @@
{% page-ref page="point-in-time-joins.md" %}
+{% page-ref page="dataset.md" %}
diff --git a/docs/getting-started/concepts/dataset.md b/docs/getting-started/concepts/dataset.md
new file mode 100644
index 0000000000..59f7168905
--- /dev/null
+++ b/docs/getting-started/concepts/dataset.md
@@ -0,0 +1,50 @@
+# Dataset
+
+Feast datasets allow for conveniently saving dataframes that include both features and entities to be subsequently used for data analysis and model training.
+[Data Quality Monitoring](https://docs.google.com/document/d/110F72d4NTv80p35wDSONxhhPBqWRwbZXG4f9mNEMd98) was the primary motivation for creating dataset concept.
+
+Dataset's metadata is stored in the Feast registry and raw data (features, entities, additional input keys and timestamp) is stored in the [offline store](../architecture-and-components/offline-store.md).
+
+Dataset can be created from:
+1. Results of historical retrieval
+2. [planned] Logging request (including input for [on demand transformation](../../reference/alpha-on-demand-feature-view.md)) and response during feature serving
+3. [planned] Logging features during writing to online store (from batch source or stream)
+
+
+### Creating Saved Dataset from Historical Retrieval
+
+To create a saved dataset from historical features for later retrieval or analysis, a user needs to call `get_historical_features` method first and then pass the returned retrieval job to `create_saved_dataset` method.
+`create_saved_dataset` will trigger provided retrieval job (by calling `.persist()` on it) to store the data using specified `storage`.
+Storage type must be the same as globally configured offline store (eg, it's impossible to persist data to Redshift with BigQuery source).
+`create_saved_dataset` will also create SavedDataset object with all related metadata and will write it to the registry.
+
+```python
+from feast import FeatureStore
+from feast.infra.offline_stores.bigquery_source import SavedDatasetBigQueryStorage
+
+store = FeatureStore()
+
+historical_job = store.get_historical_features(
+ features=["driver:avg_trip"],
+ entity_df=...,
+)
+
+dataset = store.create_saved_dataset(
+ from_=historical_job,
+ name='my_training_dataset',
+ storage=SavedDatasetBigQueryStorage(table_ref='..my_training_dataset'),
+ tags={'author': 'oleksii'}
+)
+
+dataset.to_df()
+```
+
+Saved dataset can be later retrieved using `get_saved_dataset` method:
+```python
+dataset = store.get_saved_dataset('my_training_dataset')
+dataset.to_df()
+```
+
+---
+
+Check out our [tutorial on validating historical features](../../tutorials/validating-historical-features.md) to see how this concept can be applied in real-world use case.
\ No newline at end of file
diff --git a/docs/getting-started/connect-to-feast/README.md b/docs/getting-started/connect-to-feast/README.md
deleted file mode 100644
index 4333359f90..0000000000
--- a/docs/getting-started/connect-to-feast/README.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Connect to Feast
-
-### Feast Python SDK
-
-The Feast Python SDK is used as a library to interact with a Feast deployment.
-
-* Define, register, and manage entities and features
-* Ingest data into Feast
-* Build and retrieve training datasets
-* Retrieve online features
-
-{% page-ref page="python-sdk.md" %}
-
-### Feast CLI
-
-The Feast CLI is a command line implementation of the Feast Python SDK.
-
-* Define, register, and manage entities and features from the terminal
-* Ingest data into Feast
-* Manage ingestion jobs
-
-{% page-ref page="feast-cli.md" %}
-
-### Online Serving Clients
-
-The following clients can be used to retrieve online feature values:
-
-* [Feast Python SDK](https://api.docs.feast.dev/python/)
-* [Feast Go SDK](https://godoc.org/github.com/feast-dev/feast/sdk/go)
-* [Feast Java SDK](https://javadoc.io/doc/dev.feast/feast-sdk)
-
diff --git a/docs/getting-started/connect-to-feast/feast-cli.md b/docs/getting-started/connect-to-feast/feast-cli.md
deleted file mode 100644
index d15414f360..0000000000
--- a/docs/getting-started/connect-to-feast/feast-cli.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# Feast CLI
-
-Install the Feast CLI using pip:
-
-```bash
-pip install feast
-```
-
-Configure the CLI to connect to your Feast Core deployment:
-
-```text
-feast config set core_url your.feast.deployment
-```
-
-{% hint style="info" %}
-By default, all configuration is stored in `~/.feast/config`
-{% endhint %}
-
-The CLI is a wrapper around the [Feast Python SDK](python-sdk.md):
-
-```aspnet
-$ feast
-
-Usage: feast [OPTIONS] COMMAND [ARGS]...
-
-Options:
- --help Show this message and exit.
-
-Commands:
- config View and edit Feast properties
- entities Create and manage entities
- feature-tables Create and manage feature tables
- jobs Create and manage jobs
- projects Create and manage projects
- version Displays version and connectivity information
-```
-
diff --git a/docs/getting-started/connect-to-feast/python-sdk.md b/docs/getting-started/connect-to-feast/python-sdk.md
deleted file mode 100644
index bf31bd3849..0000000000
--- a/docs/getting-started/connect-to-feast/python-sdk.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# Python SDK
-
-Install the [Feast Python SDK](https://api.docs.feast.dev/python/) using pip:
-
-```bash
-pip install feast
-```
-
-Connect to an existing Feast Core deployment:
-
-```python
-from feast import Client
-
-# Connect to an existing Feast Core deployment
-client = Client(core_url='feast.example.com:6565')
-
-# Ensure that your client is connected by printing out some feature tables
-client.list_feature_tables()
-```
-
diff --git a/docs/getting-started/install-feast/README.md b/docs/getting-started/install-feast/README.md
deleted file mode 100644
index 6c1dd80134..0000000000
--- a/docs/getting-started/install-feast/README.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Install Feast
-
-{% hint style="success" %}
-_Would you prefer a lighter-weight, pip-install, no-Kubernetes deployment of Feast?_ The Feast maintainers are currently building a new deployment experience for Feast. If you have thoughts on Feast's deployment, [chat with the maintainers](https://calendly.com/d/gc29-y88c/feast-chat-w-willem-and-jay) to learn more and provide feedback.
-{% endhint %}
-
-A production deployment of Feast is deployed using Kubernetes.
-
-## Kubernetes \(with Helm\)
-
-This guide installs Feast into an existing Kubernetes cluster using Helm. The installation is not specific to any cloud platform or environment, but requires Kubernetes and Helm.
-
-## Amazon EKS \(with Terraform\)
-
-This guide installs Feast into an AWS environment using Terraform. The Terraform script is opinionated and intended to allow you to start quickly.
-
-## Azure AKS \(with Helm\)
-
-This guide installs Feast into an Azure AKS environment with Helm.
-
-## Azure AKS \(with Terraform\)
-
-This guide installs Feast into an Azure environment using Terraform. The Terraform script is opinionated and intended to allow you to start quickly.
-
-## Google Cloud GKE \(with Terraform\)
-
-This guide installs Feast into a Google Cloud environment using Terraform. The Terraform script is opinionated and intended to allow you to start quickly.
-
-## IBM Cloud Kubernetes Service \(IKS\) and Red Hat OpenShift \(using Kustomize\)
-
-This guide installs Feast into an existing [IBM Cloud Kubernetes Service](https://www.ibm.com/cloud/kubernetes-service) or [Red Hat OpenShift on IBM Cloud](https://www.ibm.com/cloud/openshift) using Kustomize.
-
-{% page-ref page="ibm-cloud-iks-with-kustomize.md" %}
diff --git a/docs/getting-started/install-feast/google-cloud-gke-with-terraform.md b/docs/getting-started/install-feast/google-cloud-gke-with-terraform.md
deleted file mode 100644
index a3252cf0bb..0000000000
--- a/docs/getting-started/install-feast/google-cloud-gke-with-terraform.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# Google Cloud GKE \(with Terraform\)
-
-### Overview
-
-This guide installs Feast on GKE using our [reference Terraform configuration](https://github.com/feast-dev/feast/tree/master/infra/terraform/gcp).
-
-{% hint style="info" %}
-The Terraform configuration used here is a greenfield installation that neither assumes anything about, nor integrates with, existing resources in your GCP account. The Terraform configuration presents an easy way to get started, but you may want to customize this set up before using Feast in production.
-{% endhint %}
-
-This Terraform configuration creates the following resources:
-
-* GKE cluster
-* Feast services running on GKE
-* Google Memorystore \(Redis\) as online store
-* Dataproc cluster
-* Kafka running on GKE, exposed to the dataproc cluster via internal load balancer
-
-### 1. Requirements
-
-* Install [Terraform](https://www.terraform.io/) > = 0.12 \(tested with 0.13.3\)
-* Install [Helm](https://helm.sh/docs/intro/install/) \(tested with v3.3.4\)
-* GCP [authentication](https://cloud.google.com/docs/authentication) and sufficient [privilege](https://cloud.google.com/iam/docs/understanding-roles) to create the resources listed above.
-
-### 2. Configure Terraform
-
-Create a `.tfvars` file under`feast/infra/terraform/gcp`. Name the file. In our example, we use `my_feast.tfvars`. You can see the full list of configuration variables in `variables.tf`. Sample configurations are provided below:
-
-{% code title="my\_feast.tfvars" %}
-```typescript
-gcp_project_name = "kf-feast"
-name_prefix = "feast-0-8"
-region = "asia-east1"
-gke_machine_type = "n1-standard-2"
-network = "default"
-subnetwork = "default"
-dataproc_staging_bucket = "feast-dataproc"
-```
-{% endcode %}
-
-### 3. Apply
-
-After completing the configuration, initialize Terraform and apply:
-
-```bash
-$ cd feast/infra/terraform/gcp
-$ terraform init
-$ terraform apply -var-file=my_feast.tfvars
-```
-
-
-
diff --git a/docs/getting-started/install-feast/ibm-cloud-iks-with-kustomize.md b/docs/getting-started/install-feast/ibm-cloud-iks-with-kustomize.md
deleted file mode 100644
index 817d4dbe14..0000000000
--- a/docs/getting-started/install-feast/ibm-cloud-iks-with-kustomize.md
+++ /dev/null
@@ -1,185 +0,0 @@
-# IBM Cloud Kubernetes Service and Red Hat OpenShift \(with Kustomize\)
-
-## Overview
-
-This guide installs Feast on an existing IBM Cloud Kubernetes cluster or Red Hat OpenShift on IBM Cloud , and ensures the following services are running:
-
-* Feast Core
-* Feast Online Serving
-* Postgres
-* Redis
-* Kafka \(Optional\)
-* Feast Jupyter \(Optional\)
-* Prometheus \(Optional\)
-
-## 1. Prerequisites
-
-1. [IBM Cloud Kubernetes Service](https://www.ibm.com/cloud/kubernetes-service) or [Red Hat OpenShift on IBM Cloud](https://www.ibm.com/cloud/openshift)
-2. Install [Kubectl](https://cloud.ibm.com/docs/containers?topic=containers-cs_cli_install#kubectl) that matches the major.minor versions of your IKS or Install the [OpenShift CLI](https://cloud.ibm.com/docs/openshift?topic=openshift-openshift-cli#cli_oc) that matches your local operating system and OpenShift cluster version.
-3. Install [Helm 3](https://helm.sh/)
-4. Install [Kustomize](https://kubectl.docs.kubernetes.io/installation/kustomize/)
-
-## 2. Preparation
-### IBM Cloud Block Storage Setup (IKS only)
-
-:warning: If you have Red Hat OpenShift Cluster on IBM Cloud skip to this [section](#Security-Context-Constraint-Setup).
-
-By default, IBM Cloud Kubernetes cluster uses [IBM Cloud File Storage](https://www.ibm.com/cloud/file-storage) based on NFS as the default storage class, and non-root users do not have write permission on the volume mount path for NFS-backed storage. Some common container images in Feast, such as Redis, Postgres, and Kafka specify a non-root user to access the mount path in the images. When containers are deployed using these images, the containers fail to start due to insufficient permissions of the non-root user creating folders on the mount path.
-
-[IBM Cloud Block Storage](https://www.ibm.com/cloud/block-storage) allows for the creation of raw storage volumes and provides faster performance without the permission restriction of NFS-backed storage
-
-Therefore, to deploy Feast we need to set up [IBM Cloud Block Storage](https://cloud.ibm.com/docs/containers?topic=containers-block_storage#install_block) as the default storage class so that you can have all the functionalities working and get the best experience from Feast.
-
-1. [Follow the instructions](https://helm.sh/docs/intro/install/) to install the Helm version 3 client on your local machine.
-2. Add the IBM Cloud Helm chart repository to the cluster where you want to use the IBM Cloud Block Storage plug-in.
-
- ```text
- helm repo add iks-charts https://icr.io/helm/iks-charts
- helm repo update
- ```
-
-3. Install the IBM Cloud Block Storage plug-in. When you install the plug-in, pre-defined block storage classes are added to your cluster.
-
- ```text
- helm install v2.0.2 iks-charts/ibmcloud-block-storage-plugin -n kube-system
- ```
-
- Example output:
-
- ```text
- NAME: v2.0.2
- LAST DEPLOYED: Fri Feb 5 12:29:50 2021
- NAMESPACE: kube-system
- STATUS: deployed
- REVISION: 1
- NOTES:
- Thank you for installing: ibmcloud-block-storage-plugin. Your release is named: v2.0.2
- ...
- ```
-
-4. Verify that all block storage plugin pods are in a "Running" state.
-
- ```text
- kubectl get pods -n kube-system | grep ibmcloud-block-storage
- ```
-
-5. Verify that the storage classes for Block Storage were added to your cluster.
-
- ```text
- kubectl get storageclasses | grep ibmc-block
- ```
-
-6. Set the Block Storage as the default storageclass.
-
- ```text
- kubectl patch storageclass ibmc-block-gold -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
- kubectl patch storageclass ibmc-file-gold -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
-
- # Check the default storageclass is block storage
- kubectl get storageclass | grep \(default\)
- ```
-
- Example output:
-
- ```text
- ibmc-block-gold (default) ibm.io/ibmc-block 65s
- ```
-### Security Context Constraint Setup
-
-By default, in OpenShift, all pods or containers will use the [Restricted SCC](https://docs.openshift.com/container-platform/4.6/authentication/managing-security-context-constraints.html) which limits the UIDs pods can run with, causing the Feast installation to fail. To overcome this, you can allow Feast pods to run with any UID by executing the following:
-
-```text
-oc adm policy add-scc-to-user anyuid -z default,kf-feast-kafka -n feast
-```
-## 3. Installation
-
-Install Feast using kustomize. The pods may take a few minutes to initialize.
-
-```bash
-git clone https://github.com/kubeflow/manifests
-cd manifests/contrib/feast/
-kustomize build feast/base | kubectl apply -n feast -f -
-```
-### Optional: Enable Feast Jupyter and Kafka
-
-You may optionally enable the Feast Jupyter component which contains code examples to demonstrate Feast. Some examples require Kafka to stream real time features to the Feast online serving. To enable, edit the following properties in the `values.yaml` under the `manifests/contrib/feast` folder:
-```
-kafka.enabled: true
-feast-jupyter.enabled: true
-```
-
-Then regenerate the resource manifests and deploy:
-```
-make feast/base
-kustomize build feast/base | kubectl apply -n feast -f -
-```
-
-## 4. Use Feast Jupyter to connect to Feast
-
-After all the pods are in a `RUNNING` state, port-forward to the Jupyter Notebook Server in the cluster:
-
-```bash
-kubectl port-forward \
-$(kubectl get pod -l app=feast-jupyter -o custom-columns=:metadata.name) 8888:8888 -n feast
-```
-
-```text
-Forwarding from 127.0.0.1:8888 -> 8888
-Forwarding from [::1]:8888 -> 8888
-```
-
-You can now connect to the bundled Jupyter Notebook Server at `localhost:8888` and follow the example Jupyter notebook.
-
-{% embed url="http://localhost:8888/tree?" caption="" %}
-
-## 5. Uninstall Feast
-```text
-kustomize build feast/base | kubectl delete -n feast -f -
-```
-## 6. Troubleshooting
-
-When running the minimal\_ride\_hailing\_example Jupyter Notebook example the following errors may occur:
-
-1. When running `job = client.get_historical_features(...)`:
-
- ```text
- KeyError: 'historical_feature_output_location'
- ```
-
- or
-
- ```text
- KeyError: 'spark_staging_location'
- ```
-
- Add the following environment variable:
-
- ```text
- os.environ["FEAST_HISTORICAL_FEATURE_OUTPUT_LOCATION"] = "file:///home/jovyan/historical_feature_output"
- os.environ["FEAST_SPARK_STAGING_LOCATION"] = "file:///home/jovyan/test_data"
- ```
-
-2. When running `job.get_status()`
-
- ```text
-
- ```
-
- Add the following environment variable:
-
- ```text
- os.environ["FEAST_REDIS_HOST"] = "feast-release-redis-master"
- ```
-
-3. When running `job = client.start_stream_to_online_ingestion(...)`
-
- ```text
- org.apache.kafka.vendor.common.KafkaException: Failed to construct kafka consumer
- ```
-
- Add the following environment variable:
-
- ```text
- os.environ["DEMO_KAFKA_BROKERS"] = "feast-release-kafka:9092"
- ```
-
diff --git a/docs/getting-started/install-feast/kubernetes-amazon-eks-with-terraform.md b/docs/getting-started/install-feast/kubernetes-amazon-eks-with-terraform.md
deleted file mode 100644
index 99ff4a8e81..0000000000
--- a/docs/getting-started/install-feast/kubernetes-amazon-eks-with-terraform.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# Amazon EKS \(with Terraform\)
-
-### Overview
-
-This guide installs Feast on AWS using our [reference Terraform configuration](https://github.com/feast-dev/feast/tree/master/infra/terraform/aws).
-
-{% hint style="info" %}
-The Terraform configuration used here is a greenfield installation that neither assumes anything about, nor integrates with, existing resources in your AWS account. The Terraform configuration presents an easy way to get started, but you may want to customize this set up before using Feast in production.
-{% endhint %}
-
-This Terraform configuration creates the following resources:
-
-* Kubernetes cluster on Amazon EKS \(3x r3.large nodes\)
-* Kafka managed by Amazon MSK \(2x kafka.t3.small nodes\)
-* Postgres database for Feast metadata, using serverless Aurora \(min capacity: 2\)
-* Redis cluster, using Amazon Elasticache \(1x cache.t2.micro\)
-* Amazon EMR cluster to run Spark \(3x spot m4.xlarge\)
-* Staging S3 bucket to store temporary data
-
-![](../../.gitbook/assets/feast-on-aws-3-%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%282%29%20%281%29.png)
-
-### 1. Requirements
-
-* Create an AWS account and [configure credentials locally](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)
-* Install [Terraform](https://www.terraform.io/) > = 0.12 \(tested with 0.13.3\)
-* Install [Helm](https://helm.sh/docs/intro/install/) \(tested with v3.3.4\)
-
-### 2. Configure Terraform
-
-Create a `.tfvars` file under`feast/infra/terraform/aws`. Name the file. In our example, we use `my_feast.tfvars`. You can see the full list of configuration variables in `variables.tf`. At a minimum, you need to set `name_prefix` and an AWS region:
-
-{% code title="my\_feast.tfvars" %}
-```typescript
-name_prefix = "my-feast"
-region = "us-east-1"
-```
-{% endcode %}
-
-### 3. Apply
-
-After completing the configuration, initialize Terraform and apply:
-
-```bash
-$ cd feast/infra/terraform/aws
-$ terraform init
-$ terraform apply -var-file=my_feast.tfvars
-```
-
-Starting may take a minute. A kubectl configuration file is also created in this directory, and the file's name will start with `kubeconfig_` and end with a random suffix.
-
-### 4. Connect to Feast using Jupyter
-
-After all pods are running, connect to the Jupyter Notebook Server running in the cluster.
-
-To connect to the remote Feast server you just created, forward a port from the remote k8s cluster to your local machine. Replace `kubeconfig_XXXXXXX` below with the kubeconfig file name Terraform generates for you.
-
-```bash
-KUBECONFIG=kubeconfig_XXXXXXX kubectl port-forward \
-$(kubectl get pod -o custom-columns=:metadata.name | grep jupyter) 8888:8888
-```
-
-```text
-Forwarding from 127.0.0.1:8888 -> 8888
-Forwarding from [::1]:8888 -> 8888
-```
-
-You can now connect to the bundled Jupyter Notebook Server at `localhost:8888` and follow the example Jupyter notebook.
-
diff --git a/docs/getting-started/install-feast/kubernetes-azure-aks-with-helm.md b/docs/getting-started/install-feast/kubernetes-azure-aks-with-helm.md
deleted file mode 100644
index 66ba73ef23..0000000000
--- a/docs/getting-started/install-feast/kubernetes-azure-aks-with-helm.md
+++ /dev/null
@@ -1,139 +0,0 @@
-# Azure AKS \(with Helm\)
-
-## Overview
-
-This guide installs Feast on Azure Kubernetes cluster \(known as AKS\), and ensures the following services are running:
-
-* Feast Core
-* Feast Online Serving
-* Postgres
-* Redis
-* Spark
-* Kafka
-* Feast Jupyter \(Optional\)
-* Prometheus \(Optional\)
-
-## 1. Requirements
-
-1. Install and configure [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli)
-2. Install and configure [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
-3. Install [Helm 3](https://helm.sh/)
-
-## 2. Preparation
-
-Create an AKS cluster with Azure CLI. The detailed steps can be found [here](https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough), and a high-level walk through includes:
-
-```bash
-az group create --name myResourceGroup --location eastus
-az acr create --resource-group myResourceGroup --name feast-AKS-ACR --sku Basic
-az aks create -g myResourceGroup -n feast-AKS --location eastus --attach-acr feast-AKS-ACR --generate-ssh-keys
-
-az aks install-cli
-az aks get-credentials --resource-group myResourceGroup --name feast-AKS
-```
-
-Add the Feast Helm repository and download the latest charts:
-
-```bash
-helm version # make sure you have the latest Helm installed
-helm repo add feast-charts https://feast-helm-charts.storage.googleapis.com
-helm repo update
-```
-
-Feast includes a Helm chart that installs all necessary components to run Feast Core, Feast Online Serving, and an example Jupyter notebook.
-
-Feast Core requires Postgres to run, which requires a secret to be set on Kubernetes:
-
-```bash
-kubectl create secret generic feast-postgresql --from-literal=postgresql-password=password
-```
-
-## 3. Feast installation
-
-Install Feast using Helm. The pods may take a few minutes to initialize.
-
-```bash
-helm install feast-release feast-charts/feast
-```
-
-## 4. Spark operator installation
-
-Follow the documentation [to install Spark operator on Kubernetes ](https://github.com/GoogleCloudPlatform/spark-on-k8s-operator), and Feast documentation to [configure Spark roles](../../reference/feast-and-spark.md)
-
-```bash
-helm repo add spark-operator https://googlecloudplatform.github.io/spark-on-k8s-operator
-helm install my-release spark-operator/spark-operator --set serviceAccounts.spark.name=spark --set image.tag=v1beta2-1.1.2-2.4.5
-```
-
-and ensure the service account used by Feast has permissions to manage Spark Application resources. This depends on your k8s setup, but typically you'd need to configure a Role and a RoleBinding like the one below:
-
-```text
-cat <
-rules:
-- apiGroups: ["sparkoperator.k8s.io"]
- resources: ["sparkapplications"]
- verbs: ["create", "delete", "deletecollection", "get", "list", "update", "watch", "patch"]
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: RoleBinding
-metadata:
- name: use-spark-operator
- namespace:
-roleRef:
- kind: Role
- name: use-spark-operator
- apiGroup: rbac.authorization.k8s.io
-subjects:
- - kind: ServiceAccount
- name: default
-EOF
-```
-
-## 5. Use Jupyter to connect to Feast
-
-After all the pods are in a `RUNNING` state, port-forward to the Jupyter Notebook Server in the cluster:
-
-```bash
-kubectl port-forward \
-$(kubectl get pod -o custom-columns=:metadata.name | grep jupyter) 8888:8888
-```
-
-```text
-Forwarding from 127.0.0.1:8888 -> 8888
-Forwarding from [::1]:8888 -> 8888
-```
-
-You can now connect to the bundled Jupyter Notebook Server at `localhost:8888` and follow the example Jupyter notebook.
-
-{% embed url="http://localhost:8888/tree?" caption="" %}
-
-## 6. Environment variables
-
-If you are running the [Minimal Ride Hailing Example](https://github.com/feast-dev/feast/blob/master/examples/minimal/minimal_ride_hailing.ipynb), you may want to make sure the following environment variables are correctly set:
-
-```text
-demo_data_location = "wasbs://@.blob.core.windows.net/"
-os.environ["FEAST_AZURE_BLOB_ACCOUNT_NAME"] = ""
-os.environ["FEAST_AZURE_BLOB_ACCOUNT_ACCESS_KEY"] =
-os.environ["FEAST_HISTORICAL_FEATURE_OUTPUT_LOCATION"] = "wasbs://@.blob.core.windows.net/out/"
-os.environ["FEAST_SPARK_STAGING_LOCATION"] = "wasbs://@.blob.core.windows.net/artifacts/"
-os.environ["FEAST_SPARK_LAUNCHER"] = "k8s"
-os.environ["FEAST_SPARK_K8S_NAMESPACE"] = "default"
-os.environ["FEAST_HISTORICAL_FEATURE_OUTPUT_FORMAT"] = "parquet"
-os.environ["FEAST_REDIS_HOST"] = "feast-release-redis-master.default.svc.cluster.local"
-os.environ["DEMO_KAFKA_BROKERS"] = "feast-release-kafka.default.svc.cluster.local:9092"
-```
-
-## 7. Further Reading
-
-* [Feast Concepts](../../concepts/overview.md)
-* [Feast Examples/Tutorials](https://github.com/feast-dev/feast/tree/master/examples)
-* [Feast Helm Chart Documentation](https://github.com/feast-dev/feast/blob/master/infra/charts/feast/README.md)
-* [Configuring Feast components](../../reference/configuration-reference.md)
-* [Feast and Spark](../../reference/feast-and-spark.md)
-
diff --git a/docs/getting-started/install-feast/kubernetes-azure-aks-with-terraform.md b/docs/getting-started/install-feast/kubernetes-azure-aks-with-terraform.md
deleted file mode 100644
index 71dd15908d..0000000000
--- a/docs/getting-started/install-feast/kubernetes-azure-aks-with-terraform.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# Azure AKS \(with Terraform\)
-
-## Overview
-
-This guide installs Feast on Azure using our [reference Terraform configuration](https://github.com/feast-dev/feast/tree/master/infra/terraform/azure).
-
-{% hint style="info" %}
-The Terraform configuration used here is a greenfield installation that neither assumes anything about, nor integrates with, existing resources in your Azure account. The Terraform configuration presents an easy way to get started, but you may want to customize this set up before using Feast in production.
-{% endhint %}
-
-This Terraform configuration creates the following resources:
-
-* Kubernetes cluster on Azure AKS
-* Kafka managed by HDInsight
-* Postgres database for Feast metadata, running as a pod on AKS
-* Redis cluster, using Azure Cache for Redis
-* [spark-on-k8s-operator](https://github.com/GoogleCloudPlatform/spark-on-k8s-operator) to run Spark
-* Staging Azure blob storage container to store temporary data
-
-## 1. Requirements
-
-* Create an Azure account and [configure credentials locally](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli)
-* Install [Terraform](https://www.terraform.io/) \(tested with 0.13.5\)
-* Install [Helm](https://helm.sh/docs/intro/install/) \(tested with v3.4.2\)
-
-## 2. Configure Terraform
-
-Create a `.tfvars` file under`feast/infra/terraform/azure`. Name the file. In our example, we use `my_feast.tfvars`. You can see the full list of configuration variables in `variables.tf`. At a minimum, you need to set `name_prefix` and `resource_group`:
-
-{% code title="my\_feast.tfvars" %}
-```typescript
-name_prefix = "feast"
-resource_group = "Feast" # pre-existing resource group
-```
-{% endcode %}
-
-## 3. Apply
-
-After completing the configuration, initialize Terraform and apply:
-
-```bash
-$ cd feast/infra/terraform/azure
-$ terraform init
-$ terraform apply -var-file=my_feast.tfvars
-```
-
-## 4. Connect to Feast using Jupyter
-
-After all pods are running, connect to the Jupyter Notebook Server running in the cluster.
-
-To connect to the remote Feast server you just created, forward a port from the remote k8s cluster to your local machine.
-
-```bash
-kubectl port-forward $(kubectl get pod -o custom-columns=:metadata.name | grep jupyter) 8888:8888
-```
-
-```text
-Forwarding from 127.0.0.1:8888 -> 8888
-Forwarding from [::1]:8888 -> 8888
-```
-
-You can now connect to the bundled Jupyter Notebook Server at `localhost:8888` and follow the example Jupyter notebook.
-
diff --git a/docs/getting-started/install-feast/kubernetes-with-helm.md b/docs/getting-started/install-feast/kubernetes-with-helm.md
deleted file mode 100644
index f31d666ba9..0000000000
--- a/docs/getting-started/install-feast/kubernetes-with-helm.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# Kubernetes \(with Helm\)
-
-## Overview
-
-This guide installs Feast on an existing Kubernetes cluster, and ensures the following services are running:
-
-* Feast Core
-* Feast Online Serving
-* Postgres
-* Redis
-* Feast Jupyter \(Optional\)
-* Prometheus \(Optional\)
-
-## 1. Requirements
-
-1. Install and configure [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
-2. Install [Helm 3](https://helm.sh/)
-
-## 2. Preparation
-
-Add the Feast Helm repository and download the latest charts:
-
-```text
-helm repo add feast-charts https://feast-helm-charts.storage.googleapis.com
-helm repo update
-```
-
-Feast includes a Helm chart that installs all necessary components to run Feast Core, Feast Online Serving, and an example Jupyter notebook.
-
-Feast Core requires Postgres to run, which requires a secret to be set on Kubernetes:
-
-```bash
-kubectl create secret generic feast-postgresql --from-literal=postgresql-password=password
-```
-
-## 3. Installation
-
-Install Feast using Helm. The pods may take a few minutes to initialize.
-
-```bash
-helm install feast-release feast-charts/feast
-```
-
-## 4. Use Jupyter to connect to Feast
-
-After all the pods are in a `RUNNING` state, port-forward to the Jupyter Notebook Server in the cluster:
-
-```bash
-kubectl port-forward \
-$(kubectl get pod -l app=feast-jupyter -o custom-columns=:metadata.name) 8888:8888
-```
-
-```text
-Forwarding from 127.0.0.1:8888 -> 8888
-Forwarding from [::1]:8888 -> 8888
-```
-
-You can now connect to the bundled Jupyter Notebook Server at `localhost:8888` and follow the example Jupyter notebook.
-
-{% embed url="http://localhost:8888/tree?" caption="" %}
-
-## 5. Further Reading
-
-* [Feast Concepts](../../concepts/overview.md)
-* [Feast Examples/Tutorials](https://github.com/feast-dev/feast/tree/master/examples)
-* [Feast Helm Chart Documentation](https://github.com/feast-dev/feast/blob/master/infra/charts/feast/README.md)
-* [Configuring Feast components](../../reference/configuration-reference.md)
-* [Feast and Spark](../../reference/feast-and-spark.md)
-
diff --git a/docs/getting-started/learn-feast.md b/docs/getting-started/learn-feast.md
deleted file mode 100644
index 10f2eb6d29..0000000000
--- a/docs/getting-started/learn-feast.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Learn Feast
-
-Explore the following resources to learn more about Feast:
-
-* [Concepts](../) describes all important Feast API concepts.
-* [User guide](../user-guide/define-and-ingest-features.md) provides guidance on completing Feast workflows.
-* [Examples](https://github.com/feast-dev/feast/tree/master/examples) contains Jupyter notebooks that you can run on your Feast deployment.
-* [Advanced](../advanced/troubleshooting.md) contains information about both advanced and operational aspects of Feast.
-* [Reference](../reference/api/) contains detailed API and design documents for advanced users.
-* [Contributing](../contributing/contributing.md) contains resources for anyone who wants to contribute to Feast.
-
-{% hint style="info" %}
-The best way to learn Feast is to use it. Jump over to our [Quickstart](../quickstart.md) guide to have one of our examples running in no time at all!
-{% endhint %}
-
diff --git a/docs/getting-started/quickstart.md b/docs/getting-started/quickstart.md
index f93a3aa714..c067513d31 100644
--- a/docs/getting-started/quickstart.md
+++ b/docs/getting-started/quickstart.md
@@ -17,7 +17,7 @@ In this tutorial, we use feature stores to generate training data and power onli
1. **Training-serving skew and complex data joins:** Feature values often exist across multiple tables. Joining these datasets can be complicated, slow, and error-prone.
* Feast joins these tables with battle-tested logic that ensures _point-in-time_ correctness so future feature values do not leak to models.
- * _\*Upcoming_: Feast alerts users to offline / online skew with data quality monitoring.
+ * Feast alerts users to offline / online skew with data quality monitoring
2. **Online feature availability:** At inference time, models often need access to features that aren't readily available and need to be precomputed from other datasources.
* Feast manages deployment to a variety of online stores (e.g. DynamoDB, Redis, Google Cloud Datastore) and ensures necessary features are consistently _available_ and _freshly computed_ at inference time.
3. **Feature reusability and model versioning:** Different teams within an organization are often unable to reuse features across projects, resulting in duplicate feature creation logic. Models have data dependencies that need to be versioned, for example when running A/B tests on model versions.
@@ -28,7 +28,7 @@ In this tutorial, we use feature stores to generate training data and power onli
Install the Feast SDK and CLI using pip:
-* In this tutorial, we focus on a local deployment. For a more in-depth guide on how to use Feast with GCP or AWS deployments, see [Running Feast with GCP/AWS](../how-to-guides/feast-gcp-aws/)
+* In this tutorial, we focus on a local deployment. For a more in-depth guide on how to use Feast with Snowflake / GCP / AWS deployments, see [Running Feast with Snowflake/GCP/AWS](../how-to-guides/feast-snowflake-gcp-aws/)
{% tabs %}
{% tab title="Bash" %}
@@ -123,11 +123,14 @@ The key line defining the overall architecture of the feature store is the **pro
Valid values for `provider` in `feature_store.yaml` are:
-* local: use file source / SQLite
-* gcp: use BigQuery / Google Cloud Datastore
-* aws: use Redshift / DynamoDB
+* local: use file source with SQLite/Redis
+* gcp: use BigQuery/Snowflake with Google Cloud Datastore/Redis
+* aws: use Redshift/Snowflake with DynamoDB/Redis
+
+Note that there are many other sources Feast works with, including Azure, Hive, Trino, and PostgreSQL via community plugins. See [Third party integrations](../getting-started/third-party-integrations.md) for all supported datasources.
+
+A custom setup can also be made by following [adding a custom provider](../how-to-guides/creating-a-custom-provider.md).
-To use a custom provider, see [adding a custom provider](../how-to-guides/creating-a-custom-provider.md). There are also several plugins maintained by the community: [Azure](https://github.com/Azure/feast-azure), [Postgres](https://github.com/nossrannug/feast-postgres), and [Hive](https://github.com/baineng/feast-hive). Note that the choice of provider gives sensible defaults but does not enforce those choices; for example, if you choose the AWS provider, you can use [Redis](../reference/online-stores/redis.md) as an online store alongside Redshift as an offline store.
## Step 3: Register feature definitions and deploy your feature store
@@ -345,5 +348,5 @@ pprint(feature_vector)
* Read the [Concepts](concepts/) page to understand the Feast data model.
* Read the [Architecture](architecture-and-components/) page.
* Check out our [Tutorials](../tutorials/tutorials-overview.md) section for more examples on how to use Feast.
-* Follow our [Running Feast with GCP/AWS](../how-to-guides/feast-gcp-aws/) guide for a more in-depth tutorial on using Feast.
+* Follow our [Running Feast with Snowflake/GCP/AWS](../how-to-guides/feast-snowflake-gcp-aws/) guide for a more in-depth tutorial on using Feast.
* Join other Feast users and contributors in [Slack](https://slack.feast.dev) and become part of the community!
diff --git a/docs/getting-started/third-party-integrations.md b/docs/getting-started/third-party-integrations.md
index 31b6acdc88..c085d6d0ae 100644
--- a/docs/getting-started/third-party-integrations.md
+++ b/docs/getting-started/third-party-integrations.md
@@ -13,27 +13,29 @@ Don't see your offline store or online store of choice here? Check out our guide
### **Data Sources**
+* [x] [Snowflake source](https://docs.feast.dev/reference/data-sources/snowflake)
* [x] [Redshift source](https://docs.feast.dev/reference/data-sources/redshift)
* [x] [BigQuery source](https://docs.feast.dev/reference/data-sources/bigquery)
* [x] [Parquet file source](https://docs.feast.dev/reference/data-sources/file)
* [x] [Synapse source (community plugin)](https://github.com/Azure/feast-azure)
* [x] [Hive (community plugin)](https://github.com/baineng/feast-hive)
* [x] [Postgres (community plugin)](https://github.com/nossrannug/feast-postgres)
+* [x] [Spark (community plugin)](https://github.com/Adyen/feast-spark-offline-store)
* [x] Kafka source (with [push support into the online store](https://docs.feast.dev/reference/alpha-stream-ingestion))
-* [x] [Snowflake source (community plugin)](https://github.com/sfc-gh-madkins/feast-snowflake)
* [ ] HTTP source
### Offline Stores
+* [x] [Snowflake](https://docs.feast.dev/reference/offline-stores/snowflake)
* [x] [Redshift](https://docs.feast.dev/reference/offline-stores/redshift)
* [x] [BigQuery](https://docs.feast.dev/reference/offline-stores/bigquery)
* [x] [Synapse (community plugin)](https://github.com/Azure/feast-azure)
* [x] [Hive (community plugin)](https://github.com/baineng/feast-hive)
* [x] [Postgres (community plugin)](https://github.com/nossrannug/feast-postgres)
+* [x] [Trino (community plugin)](https://github.com/Shopify/feast-trino)
+* [x] [Spark (community plugin)](https://github.com/Adyen/feast-spark-offline-store)
* [x] [In-memory / Pandas](https://docs.feast.dev/reference/offline-stores/file)
* [x] [Custom offline store support](https://docs.feast.dev/how-to-guides/adding-a-new-offline-store)
-* [x] [Snowflake source (community plugin)](https://github.com/sfc-gh-madkins/feast-snowflake)
-* [x] [Trino (communiuty plugin)](https://github.com/Shopify/feast-trino)
### Online Stores
@@ -59,7 +61,7 @@ Don't see your offline store or online store of choice here? Check out our guide
In order for a plugin integration to be highlighted on this page, it must meet the following requirements:
-1. The plugin must have tests. Ideally it would use the Feast universal tests (see this [guide](broken-reference) for an example), but custom tests are fine.
+1. The plugin must have tests. Ideally it would use the Feast universal tests (see this [guide](../how-to-guides/adding-or-reusing-tests.md) for an example), but custom tests are fine.
2. The plugin must have some basic documentation on how it should be used.
3. The author must work with a maintainer to pass a basic code review (e.g. to ensure that the implementation roughly matches the core Feast implementations).
diff --git a/docs/how-to-guides/adding-or-reusing-tests.md b/docs/how-to-guides/adding-or-reusing-tests.md
index 1730abe209..5a29342d6e 100644
--- a/docs/how-to-guides/adding-or-reusing-tests.md
+++ b/docs/how-to-guides/adding-or-reusing-tests.md
@@ -79,7 +79,6 @@ def test_historical_features(environment, universal_data_sources, full_feature_n
datasets["global"],
datasets["entity"],
)
-
# ... more test code
customer_fv, driver_fv, driver_odfv, order_fv, global_fv = (
@@ -93,7 +92,7 @@ def test_historical_features(environment, universal_data_sources, full_feature_n
feature_service = FeatureService(
"convrate_plus100",
features=[
- feature_views["driver"][["conv_rate"]],
+ feature_views["driver"][["conv_rate"]],
feature_views["driver_odfv"]
],
)
@@ -112,7 +111,6 @@ def test_historical_features(environment, universal_data_sources, full_feature_n
]
)
store.apply(feast_objects)
-
# ... more test code
job_from_df = store.get_historical_features(
@@ -132,13 +130,11 @@ def test_historical_features(environment, universal_data_sources, full_feature_n
full_feature_names=full_feature_names,
)
actual_df_from_df_entities = job_from_df.to_df()
-
# ... more test code
assert_frame_equal(
expected_df, actual_df_from_df_entities, check_dtype=False,
)
-
# ... more test code
```
{% endtab %}
@@ -186,6 +182,24 @@ def your_test(environment: Environment):
your_fv = driver_feature_view(data_source)
entity = driver(value_type=ValueType.UNKNOWN)
fs.apply([fv, entity])
-
+
# ... run test
```
+
+### Running your own redis cluster for testing
+
+* Install redis on your computer. If you are a mac user, you should be able to `brew install redis`.
+ * Running `redis-server --help` and `redis-cli --help` should show corresponding help menus.
+* Run `cd scripts/create-cluster` and run `./create-cluster start` then `./create-cluster create` to start the server. You should see output that looks like this:
+~~~~
+Starting 6001
+Starting 6002
+Starting 6003
+Starting 6004
+Starting 6005
+Starting 6006
+~~~~
+* You should be able to run the integration tests and have the redis cluster tests pass.
+* If you would like to run your own redis cluster, you can run the above commands with your own specified ports and connect to the newly configured cluster.
+* To stop the cluster, run `./create-cluster stop` and then `./create-cluster clean`.
+
diff --git a/docs/how-to-guides/feast-gcp-aws/README.md b/docs/how-to-guides/feast-snowflake-gcp-aws/README.md
similarity index 88%
rename from docs/how-to-guides/feast-gcp-aws/README.md
rename to docs/how-to-guides/feast-snowflake-gcp-aws/README.md
index d120eab314..753650080b 100644
--- a/docs/how-to-guides/feast-gcp-aws/README.md
+++ b/docs/how-to-guides/feast-snowflake-gcp-aws/README.md
@@ -1,4 +1,4 @@
-# Running Feast with GCP/AWS
+# Running Feast with Snowflake/GCP/AWS
{% page-ref page="install-feast.md" %}
diff --git a/docs/how-to-guides/feast-gcp-aws/build-a-training-dataset.md b/docs/how-to-guides/feast-snowflake-gcp-aws/build-a-training-dataset.md
similarity index 100%
rename from docs/how-to-guides/feast-gcp-aws/build-a-training-dataset.md
rename to docs/how-to-guides/feast-snowflake-gcp-aws/build-a-training-dataset.md
diff --git a/docs/how-to-guides/feast-gcp-aws/create-a-feature-repository.md b/docs/how-to-guides/feast-snowflake-gcp-aws/create-a-feature-repository.md
similarity index 84%
rename from docs/how-to-guides/feast-gcp-aws/create-a-feature-repository.md
rename to docs/how-to-guides/feast-snowflake-gcp-aws/create-a-feature-repository.md
index 1add0a92e8..8754bc051a 100644
--- a/docs/how-to-guides/feast-gcp-aws/create-a-feature-repository.md
+++ b/docs/how-to-guides/feast-snowflake-gcp-aws/create-a-feature-repository.md
@@ -13,6 +13,21 @@ Creating a new Feast repository in /<...>/tiny_pika.
```
{% endtab %}
+{% tabs %}
+{% tab title="Snowflake template" %}
+```bash
+feast init -t snowflake
+Snowflake Deployment URL: ...
+Snowflake User Name: ...
+Snowflake Password: ...
+Snowflake Role Name: ...
+Snowflake Warehouse Name: ...
+Snowflake Database Name: ...
+
+Creating a new Feast repository in /<...>/tiny_pika.
+```
+{% endtab %}
+
{% tab title="GCP template" %}
```text
feast init -t gcp
@@ -30,7 +45,7 @@ Redshift Database Name: ...
Redshift User Name: ...
Redshift S3 Staging Location (s3://*): ...
Redshift IAM Role for S3 (arn:aws:iam::*:role/*): ...
-Should I upload example data to Redshift (overwriting 'feast_driver_hourly_stats' table)? (Y/n):
+Should I upload example data to Redshift (overwriting 'feast_driver_hourly_stats' table)? (Y/n):
Creating a new Feast repository in /<...>/tiny_pika.
```
@@ -63,4 +78,3 @@ You can now use this feature repository for development. You can try the followi
* Run `feast apply` to apply these definitions to Feast.
* Edit the example feature definitions in `example.py` and run `feast apply` again to change feature definitions.
* Initialize a git repository in the same directory and checking the feature repository into version control.
-
diff --git a/docs/how-to-guides/feast-gcp-aws/deploy-a-feature-store.md b/docs/how-to-guides/feast-snowflake-gcp-aws/deploy-a-feature-store.md
similarity index 100%
rename from docs/how-to-guides/feast-gcp-aws/deploy-a-feature-store.md
rename to docs/how-to-guides/feast-snowflake-gcp-aws/deploy-a-feature-store.md
diff --git a/docs/how-to-guides/feast-gcp-aws/install-feast.md b/docs/how-to-guides/feast-snowflake-gcp-aws/install-feast.md
similarity index 80%
rename from docs/how-to-guides/feast-gcp-aws/install-feast.md
rename to docs/how-to-guides/feast-snowflake-gcp-aws/install-feast.md
index 019231be09..26d95c6117 100644
--- a/docs/how-to-guides/feast-gcp-aws/install-feast.md
+++ b/docs/how-to-guides/feast-snowflake-gcp-aws/install-feast.md
@@ -6,6 +6,12 @@ Install Feast using [pip](https://pip.pypa.io):
pip install feast
```
+Install Feast with Snowflake dependencies (required when using Snowflake):
+
+```
+pip install 'feast[snowflake]'
+```
+
Install Feast with GCP dependencies (required when using BigQuery or Firestore):
```
diff --git a/docs/how-to-guides/feast-gcp-aws/load-data-into-the-online-store.md b/docs/how-to-guides/feast-snowflake-gcp-aws/load-data-into-the-online-store.md
similarity index 100%
rename from docs/how-to-guides/feast-gcp-aws/load-data-into-the-online-store.md
rename to docs/how-to-guides/feast-snowflake-gcp-aws/load-data-into-the-online-store.md
diff --git a/docs/how-to-guides/feast-gcp-aws/read-features-from-the-online-store.md b/docs/how-to-guides/feast-snowflake-gcp-aws/read-features-from-the-online-store.md
similarity index 100%
rename from docs/how-to-guides/feast-gcp-aws/read-features-from-the-online-store.md
rename to docs/how-to-guides/feast-snowflake-gcp-aws/read-features-from-the-online-store.md
diff --git a/docs/how-to-guides/fetching-java-features-k8s.md b/docs/how-to-guides/fetching-java-features-k8s.md
new file mode 100644
index 0000000000..1aa6abd52b
--- /dev/null
+++ b/docs/how-to-guides/fetching-java-features-k8s.md
@@ -0,0 +1,15 @@
+# How to set up a Java feature server
+
+This tutorial guides you on how to:
+
+* Define features and data sources in Feast using the Feast CLI
+* Materialize features to a Redis cluster deployed on Kubernetes.
+* Deploy a Feast Java feature server into a Kubernetes cluster using the Feast helm charts
+* Retrieve features using the gRPC API exposed by the Feast Java server
+
+Try it and let us know what you think!
+
+| ![](../.gitbook/assets/github-mark-32px.png)[ View guide in Github](../../examples/java-demo/README.md) |
+|:--------------------------------------------------------------------------------------------------------|
+
+
diff --git a/docs/load-data-into-the-online-store.md b/docs/load-data-into-the-online-store.md
deleted file mode 100644
index 48bfb27fc4..0000000000
--- a/docs/load-data-into-the-online-store.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Load data into the online store
-
diff --git a/docs/project/release-process.md b/docs/project/release-process.md
index 8ecd55a63f..af573c92c7 100644
--- a/docs/project/release-process.md
+++ b/docs/project/release-process.md
@@ -22,7 +22,6 @@ For Feast maintainers, these are the concrete steps for making a new release.
2. Add the change log by applying the change log commit created in step 2.
3. Check that versions are updated with `env TARGET_MERGE_BRANCH=master make lint-versions`
7. Create a [GitHub release](https://github.com/feast-dev/feast/releases) which includes a summary of im~~p~~ortant changes as well as any artifacts associated with the release. Make sure to include the same change log as added in [CHANGELOG.md](../../CHANGELOG.md). Use `Feast vX.Y.Z` as the title.
-8. Update the[ Upgrade Guide](broken-reference) to include the action required instructions for users to upgrade to this new release. Instructions should include a migration for each breaking change made to this release.
When a tag that matches a Semantic Version string is pushed, CI will automatically build and push the relevant artifacts to their repositories or package managers (docker images, Python wheels, etc). JVM artifacts are promoted from Sonatype OSSRH to Maven Central, but it sometimes takes some time for them to be available. The `sdk/go/v tag` is required to version the Go SDK go module so that users can go get a specific tagged release of the Go SDK.
diff --git a/docs/read-features-from-the-online-store.md b/docs/read-features-from-the-online-store.md
deleted file mode 100644
index db082897a2..0000000000
--- a/docs/read-features-from-the-online-store.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Read features from the online store
-
diff --git a/docs/reference/api.md b/docs/reference/api.md
deleted file mode 100644
index 16467bb2dc..0000000000
--- a/docs/reference/api.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# API Reference
-
-Please see the following API specific reference documentation:
-
-* [Feast Core gRPC API](https://api.docs.feast.dev/grpc/feast.core.pb.html): This is the gRPC API used by Feast Core. Feast Core has a dual function of schema registry and job manager. This API contains RPCs for creating and managing feature sets, stores, projects, and jobs.
-* [Feast Serving gRPC API](https://api.docs.feast.dev/grpc/feast.serving.pb.html): This is the gRPC API used by Feast Serving. It contains RPCs used for the retrieval of online feature data or historical feature data.
-* [Feast gRPC Types](https://api.docs.feast.dev/grpc/feast.types.pb.html): These are the gRPC types used by both Feast Core, Feast Serving, and the Go, Java, and Python clients.
-* [Go Client SDK](https://godoc.org/github.com/feast-dev/feast/sdk/go): The Go library used for the retrieval of online features from Feast.
-* [Java Client SDK](https://javadoc.io/doc/dev.feast/feast-sdk): The Java library used for the retrieval of online features from Feast.
-* [Python SDK](https://api.docs.feast.dev/python/): This is the complete reference to the Feast Python SDK. The SDK is used to manage feature sets, features, jobs, projects, and entities. It can also be used to retrieve training datasets or online features from Feast Serving.
-
-## Community Contributions
-
-The following community provided SDKs are available:
-
-* [Node.js SDK](https://github.com/MichaelHirn/feast-client/): A Node.js SDK written in TypeScript. The SDK can be used to manage feature sets, features, jobs, projects, and entities.
-
diff --git a/docs/reference/api/README.md b/docs/reference/api/README.md
deleted file mode 100644
index cd75f5bf88..0000000000
--- a/docs/reference/api/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# API Reference
-
-Please see the following API specific reference documentation:
-
-* [Feast Core gRPC API](https://api.docs.feast.dev/grpc/feast/core/coreservice.pb.html): This is the gRPC API used by Feast Core. This API contains RPCs for creating and managing feature sets, stores, projects, and jobs.
-* [Feast Serving gRPC API](https://api.docs.feast.dev/grpc/feast/serving/servingservice.pb.html): This is the gRPC API used by Feast Serving. It contains RPCs used for the retrieval of online feature data or historical feature data.
-* [Feast gRPC Types](https://api.docs.feast.dev/grpc/feast/types/value.pb): These are the gRPC types used by both Feast Core, Feast Serving, and the Go, Java, and Python clients.
-* [Go Client SDK](https://godoc.org/github.com/feast-dev/feast/sdk/go): The Go library used for the retrieval of online features from Feast.
-* [Java Client SDK](https://javadoc.io/doc/dev.feast/feast-sdk): The Java library used for the retrieval of online features from Feast.
-* [Python SDK](https://api.docs.feast.dev/python/): This is the complete reference to the Feast Python SDK. The SDK is used to manage feature sets, features, jobs, projects, and entities. It can also be used to retrieve training datasets or online features from Feast Serving.
-
-## Community Contributions
-
-The following community provided SDKs are available:
-
-* [Node.js SDK](https://github.com/MichaelHirn/feast-client/): A Node.js SDK written in TypeScript. The SDK can be used to manage feature sets, features, jobs, projects, and entities.
-
diff --git a/docs/reference/configuration-reference.md b/docs/reference/configuration-reference.md
deleted file mode 100644
index 6f9a97dabf..0000000000
--- a/docs/reference/configuration-reference.md
+++ /dev/null
@@ -1,132 +0,0 @@
-# Configuration Reference
-
-## Overview
-
-This reference describes how to configure Feast components:
-
-* [Feast Core and Feast Online Serving](configuration-reference.md#2-feast-core-serving-and-job-controller)
-* [Feast CLI and Feast Python SDK](configuration-reference.md#3-feast-cli-and-feast-python-sdk)
-* [Feast Go and Feast Java SDK](configuration-reference.md#4-feast-java-and-go-sdk)
-
-## 1. Feast Core and Feast Online Serving
-
-Available configuration properties for Feast Core and Feast Online Serving can be referenced from the corresponding `application.yml` of each component:
-
-| Component | Configuration Reference |
-| :--- | :--- |
-| Core | [core/src/main/resources/application.yml](https://github.com/feast-dev/feast-java/blob/master/core/src/main/resources/application.yml) |
-| Serving \(Online\) | [serving/src/main/resources/application.yml](https://github.com/feast-dev/feast-java/blob/master/serving/src/main/resources/application.yml) |
-
-Configuration properties for Feast Core and Feast Online Serving are defined depending on Feast is deployed:
-
-* [Docker Compose deployment](configuration-reference.md#docker-compose-deployment) - Feast is deployed with Docker Compose.
-* [Kubernetes deployment](configuration-reference.md#kubernetes-deployment) - Feast is deployed with Kubernetes.
-* [Direct Configuration](configuration-reference.md#direct-configuration) - Feast is built and run from source code.
-
-## Docker Compose Deployment
-
-For each Feast component deployed using Docker Compose, configuration properties from `application.yml` can be set at:
-
-| Component | Configuration Path |
-| :--- | :--- |
-| Core | `infra/docker-compose/core/core.yml` |
-| Online Serving | `infra/docker-compose/serving/online-serving.yml` |
-
-## Kubernetes Deployment
-
-The Kubernetes Feast Deployment is configured using `values.yaml` in the [Helm chart](https://github.com/feast-dev/feast-helm-charts) included with Feast:
-
-```yaml
-# values.yaml
-feast-core:
- enabled: true # whether to deploy the feast-core subchart to deploy Feast Core.
- # feast-core subchart specific config.
- gcpServiceAccount:
- enabled: true
- # ....
-```
-
-A reference of the sub-chart-specific configuration can found in its `values.yml`:
-
-* [feast-core](https://github.com/feast-dev/feast-java/tree/master/infra/charts/feast-core)
-* [feast-serving](https://github.com/feast-dev/feast-java/tree/master/infra/charts/feast-serving)
-
-Configuration properties can be set via `application-override.yaml` for each component in `values.yaml`:
-
-```yaml
-# values.yaml
-feast-core:
- # ....
- application-override.yaml:
- # application.yml config properties for Feast Core.
- # ...
-```
-
-Visit the [Helm chart](https://github.com/feast-dev/feast-helm-charts) included with Feast to learn more about configuration.
-
-## Direct Configuration
-
-If Feast is built and running from source, configuration properties can be set directly in the Feast component's `application.yml`:
-
-| Component | Configuration Path |
-| :--- | :--- |
-| Core | [core/src/main/resources/application.yml](https://github.com/feast-dev/feast-java/blob/master/core/src/main/resources/application.yml) |
-| Serving \(Online\) | [serving/src/main/resources/application.yml](https://github.com/feast-dev/feast-java/blob/master/serving/src/main/resources/application.yml) |
-
-## 2. Feast CLI and Feast Python SDK
-
-Configuration options for both the [Feast CLI](../getting-started/connect-to-feast/feast-cli.md) and [Feast Python SDK](https://api.docs.feast.dev/python/) can be defined in the following locations, in order of precedence:
-
-**1. Command line arguments or initialized arguments:** Passing parameters to the Feast CLI or instantiating the Feast Client object with specific parameters will take precedence above other parameters.
-
-```bash
-# Set option as command line arguments.
-feast config set core_url "localhost:6565"
-```
-
-```python
-# Pass options as initialized arguments.
-client = Client(
- core_url="localhost:6565",
- project="default"
-)
-```
-
-**2. Environmental variables:** Environmental variables can be set to provide configuration options. They must be prefixed with `FEAST_`. For example `FEAST_CORE_URL`.
-
-```bash
-FEAST_CORE_URL=my_feast:6565 FEAST_PROJECT=default feast projects list
-```
-
-**3. Configuration file:** Options with the lowest precedence are configured in the Feast configuration file. Feast looks for or creates this configuration file in `~/.feast/config` if it does not already exist. All options must be defined in the `[general]` section of this file.
-
-```text
-[general]
-project = default
-core_url = localhost:6565
-```
-
-Visit the [available configuration parameters](https://api.docs.feast.dev/python/#module-feast.constants) for Feast Python SDK and Feast CLI to learn more.
-
-## 3. Feast Java and Go SDK
-
-The [Feast Java SDK](https://javadoc.io/doc/dev.feast/feast-sdk/latest/com/gojek/feast/package-summary.html) and [Feast Go SDK](https://godoc.org/github.com/feast-dev/feast/sdk/go) are configured via arguments passed when instantiating the respective Clients:
-
-### Go SDK
-
-```go
-// configure serving host and port.
-cli := feast.NewGrpcClient("localhost", 6566)
-```
-
-Visit the[ Feast Go SDK API reference](https://godoc.org/github.com/feast-dev/feast/sdk/go) to learn more about available configuration parameters.
-
-### Java SDK
-
-```java
-// configure serving host and port.
-client = FeastClient.create(servingHost, servingPort);
-```
-
-Visit the [Feast Java SDK API reference](https://javadoc.io/doc/dev.feast/feast-sdk/latest/com/gojek/feast/package-summary.html) to learn more about available configuration parameters.
-
diff --git a/docs/reference/data-sources/README.md b/docs/reference/data-sources/README.md
index 6732fc16a0..fc6e136a9c 100644
--- a/docs/reference/data-sources/README.md
+++ b/docs/reference/data-sources/README.md
@@ -4,7 +4,8 @@ Please see [Data Source](../../getting-started/concepts/feature-view.md#data-sou
{% page-ref page="file.md" %}
+{% page-ref page="snowflake.md" %}
+
{% page-ref page="bigquery.md" %}
{% page-ref page="redshift.md" %}
-
diff --git a/docs/reference/data-sources/snowflake.md b/docs/reference/data-sources/snowflake.md
new file mode 100644
index 0000000000..0f5304b6cd
--- /dev/null
+++ b/docs/reference/data-sources/snowflake.md
@@ -0,0 +1,44 @@
+# Snowflake
+
+## Description
+
+Snowflake data sources allow for the retrieval of historical feature values from Snowflake for building training datasets as well as materializing features into an online store.
+
+* Either a table reference or a SQL query can be provided.
+
+## Examples
+
+Using a table reference
+
+```python
+from feast import SnowflakeSource
+
+my_snowflake_source = SnowflakeSource(
+ database="FEAST",
+ schema="PUBLIC",
+ table="FEATURE_TABLE",
+)
+```
+
+Using a query
+
+```python
+from feast import SnowflakeSource
+
+my_snowflake_source = SnowflakeSource(
+ query="""
+ SELECT
+ timestamp_column AS "ts",
+ "created",
+ "f1",
+ "f2"
+ FROM
+ `FEAST.PUBLIC.FEATURE_TABLE`
+ """,
+)
+```
+
+One thing to remember is how Snowflake handles table and column name conventions.
+You can read more about quote identifiers [here](https://docs.snowflake.com/en/sql-reference/identifiers-syntax.html)
+
+Configuration options are available [here](https://rtd.feast.dev/en/latest/index.html#feast.data_source.SnowflakeSource).
diff --git a/docs/reference/dqm.md b/docs/reference/dqm.md
new file mode 100644
index 0000000000..5a02413e53
--- /dev/null
+++ b/docs/reference/dqm.md
@@ -0,0 +1,77 @@
+# Data Quality Monitoring
+
+Data Quality Monitoring (DQM) is a Feast module aimed to help users to validate their data with the user-curated set of rules.
+Validation could be applied during:
+* Historical retrieval (training dataset generation)
+* [planned] Writing features into an online store
+* [planned] Reading features from an online store
+
+Its goal is to address several complex data problems, namely:
+* Data consistency - new training datasets can be significantly different from previous datasets. This might require a change in model architecture.
+* Issues/bugs in the upstream pipeline - bugs in upstream pipelines can cause invalid values to overwrite existing valid values in an online store.
+* Training/serving skew - distribution shift could significantly decrease the performance of the model.
+
+> To monitor data quality, we check that the characteristics of the tested dataset (aka the tested dataset's profile) are "equivalent" to the characteristics of the reference dataset.
+> How exactly profile equivalency should be measured is up to the user.
+
+### Overview
+
+The validation process consists of the following steps:
+1. User prepares reference dataset (currently only [saved datasets](../getting-started/concepts/dataset.md) from historical retrieval are supported).
+2. User defines profiler function, which should produce profile by given dataset (currently only profilers based on [Great Expectations](https://docs.greatexpectations.io) are allowed).
+3. Validation of tested dataset is performed with reference dataset and profiler provided as parameters.
+
+### Preparations
+Feast with Great Expectations support can be installed via
+```shell
+pip install 'feast[ge]'
+```
+
+### Dataset profile
+Currently, Feast supports only [Great Expectation's](https://greatexpectations.io/) [ExpectationSuite](https://legacy.docs.greatexpectations.io/en/latest/autoapi/great_expectations/core/expectation_suite/index.html#great_expectations.core.expectation_suite.ExpectationSuite)
+as dataset's profile. Hence, the user needs to define a function (profiler) that would receive a dataset and return an [ExpectationSuite](https://legacy.docs.greatexpectations.io/en/latest/autoapi/great_expectations/core/expectation_suite/index.html#great_expectations.core.expectation_suite.ExpectationSuite).
+
+Great Expectations supports automatic profiling as well as manually specifying expectations:
+```python
+from great_expectations.dataset import Dataset
+from great_expectations.core.expectation_suite import ExpectationSuite
+
+from feast.dqm.profilers.ge_profiler import ge_profiler
+
+@ge_profiler
+def automatic_profiler(dataset: Dataset) -> ExpectationSuite:
+ from great_expectations.profile.user_configurable_profiler import UserConfigurableProfiler
+
+ return UserConfigurableProfiler(
+ profile_dataset=dataset,
+ ignored_columns=['conv_rate'],
+ value_set_threshold='few'
+ ).build_suite()
+```
+However, from our experience capabilities of automatic profiler are quite limited. So we would recommend crafting your own expectations:
+```python
+@ge_profiler
+def manual_profiler(dataset: Dataset) -> ExpectationSuite:
+ dataset.expect_column_max_to_be_between("column", 1, 2)
+ return dataset.get_expectation_suite()
+```
+
+
+
+### Validating Training Dataset
+During retrieval of historical features, `validation_reference` can be passed as a parameter to methods `.to_df(validation_reference=...)` or `.to_arrow(validation_reference=...)` of RetrievalJob.
+If parameter is provided Feast will run validation once dataset is materialized. In case if validation successful materialized dataset is returned.
+Otherwise, `feast.dqm.errors.ValidationFailed` exception would be raised. It will consist of all details for expectations that didn't pass.
+
+```python
+from feast import FeatureStore
+
+fs = FeatureStore(".")
+
+job = fs.get_historical_features(...)
+job.to_df(
+ validation_reference=fs
+ .get_saved_dataset("my_reference_dataset")
+ .as_reference(profiler=manual_profiler)
+)
+```
diff --git a/docs/reference/feast-and-spark.md b/docs/reference/feast-and-spark.md
deleted file mode 100644
index be05f177ae..0000000000
--- a/docs/reference/feast-and-spark.md
+++ /dev/null
@@ -1,83 +0,0 @@
----
-description: Configuring Feast to use Spark for ingestion.
----
-
-# Feast and Spark
-
-Feast relies on Spark to ingest data from the offline store to the online store, streaming ingestion, and running queries to retrieve historical data from the offline store. Feast supports several Spark deployment options.
-
-## Option 1. Use Kubernetes Operator for Apache Spark
-
-To install the Spark on K8s Operator
-
-```bash
-helm repo add spark-operator \
- https://googlecloudplatform.github.io/spark-on-k8s-operator
-
-helm install my-release spark-operator/spark-operator \
- --set serviceAccounts.spark.name=spark
-```
-
-Currently Feast is tested using `v1beta2-1.1.2-2.4.5`version of the operator image. To configure Feast to use it, set the following options in Feast config:
-
-| Feast Setting | Value |
-| :--- | :--- |
-| `SPARK_LAUNCHER` | `"k8s"` |
-| `SPARK_STAGING_LOCATION` | S3/GCS/Azure Blob Storage URL to use as a staging location, must be readable and writable by Feast. For S3, use `s3a://` prefix here. Ex.: `s3a://some-bucket/some-prefix/artifacts/` |
-| `HISTORICAL_FEATURE_OUTPUT_LOCATION` | S3/GCS/Azure Blob Storage URL used to store results of historical retrieval queries, must be readable and writable by Feast. For S3, use `s3a://` prefix here. Ex.: `s3a://some-bucket/some-prefix/out/` |
-| `SPARK_K8S_NAMESPACE` | Only needs to be set if you are customizing the spark-on-k8s-operator. The name of the Kubernetes namespace to run Spark jobs in. This should match the value of `sparkJobNamespace` set on spark-on-k8s-operator Helm chart. Typically this is also the namespace Feast itself will run in. |
-| `SPARK_K8S_JOB_TEMPLATE_PATH` | Only needs to be set if you are customizing the Spark job template. Local file path with the template of the SparkApplication resource. No prefix required. Ex.: `/home/jovyan/work/sparkapp-template.yaml`. An example template is [here](https://github.com/feast-dev/feast/blob/4059a21dc4eba9cd27b2d5b0fabe476c07a8b3bd/sdk/python/feast/pyspark/launchers/k8s/k8s_utils.py#L280-L317) and the spec is defined in the [k8s-operator User Guide](https://github.com/GoogleCloudPlatform/spark-on-k8s-operator/blob/master/docs/user-guide.md). |
-
-Lastly, make sure that the service account used by Feast has permissions to manage Spark Application resources. This depends on your k8s setup, but typically you'd need to configure a Role and a RoleBinding like the one below:
-
-```text
-cat <
-
-
-
Limitation
-
Motivation
-
-
-
-
-
Features names and entity names cannot overlap in feature table definitions
-
Features and entities become columns in historical stores which may cause
- conflicts
-
-
-
-
The following field names are reserved in feature tables
-
-
event_timestamp
-
-
datetime
-
-
created_timestamp
-
-
ingestion_id
-
-
job_id
-
-
-
-
These keywords are used for column names when persisting metadata in historical
- stores
-
-
-
-
-### Ingestion
-
-| Limitation | Motivation |
-| :--- | :--- |
-| Once data has been ingested into Feast, there is currently no way to delete the data without manually going to the database and deleting it. However, during retrieval only the latest rows will be returned for a specific key \(`event_timestamp`, `entity`\) based on its `created_timestamp`. | This functionality simply doesn't exist yet as a Feast API |
-
-### Storage
-
-| Limitation | Motivation |
-| :--- | :--- |
-| Feast does not support offline storage in Feast 0.8 | As part of our re-architecture of Feast, we moved from GCP to cloud-agnostic deployments. Developing offline storage support that is available in all cloud environments is a pending action. |
-
diff --git a/docs/reference/metrics-reference.md b/docs/reference/metrics-reference.md
deleted file mode 100644
index 34c97c7be6..0000000000
--- a/docs/reference/metrics-reference.md
+++ /dev/null
@@ -1,178 +0,0 @@
-# Metrics Reference
-
-{% hint style="warning" %}
-This page applies to Feast 0.7. The content may be out of date for Feast 0.8+
-{% endhint %}
-
-Reference of the metrics that each Feast component exports:
-
-* [Feast Core](metrics-reference.md#feast-core)
-* [Feast Serving](metrics-reference.md#feast-serving)
-* [Feast Ingestion Job](metrics-reference.md#feast-ingestion-job)
-
-For how to configure Feast to export Metrics, see the [Metrics user guide.](../advanced/metrics.md)
-
-## Feast Core
-
-**Exported Metrics**
-
-Feast Core exports the following metrics:
-
-| Metrics | Description | Tags |
-| :--- | :--- | :--- |
-| `feast_core_request_latency_seconds` | Feast Core's latency in serving Requests in Seconds. | `service`, `method`, `status_code` |
-| `feast_core_feature_set_total` | No. of Feature Sets registered with Feast Core. | None |
-| `feast_core_store_total` | No. of Stores registered with Feast Core. | None |
-| `feast_core_max_memory_bytes` | Max amount of memory the Java virtual machine will attempt to use. | None |
-| `feast_core_total_memory_bytes` | Total amount of memory in the Java virtual machine | None |
-| `feast_core_free_memory_bytes` | Total amount of free memory in the Java virtual machine. | None |
-| `feast_core_gc_collection_seconds` | Time spent in a given JVM garbage collector in seconds. | None |
-
-**Metric Tags**
-
-Exported Feast Core metrics may be filtered by the following tags/keys
-
-| Tag | Description |
-| :--- | :--- |
-| `service` | Name of the Service that request is made to. Should be set to `CoreService` |
-| `method` | Name of the Method that the request is calling. \(ie `ListFeatureSets`\) |
-| `status_code` | Status code returned as a result of handling the requests \(ie `OK`\). Can be used to find request failures. |
-
-## Feast Serving
-
-**Exported Metrics**
-
-Feast Serving exports the following metrics:
-
-| Metric | Description | Tags |
-| :--- | :--- | :--- |
-| `feast_serving_request_latency_seconds` | Feast Serving's latency in serving Requests in Seconds. | `method` |
-| `feast_serving_request_feature_count` | No. of requests retrieving a Feature from Feast Serving. | `project`, `feature_name` |
-| `feast_serving_not_found_feature_count` | No. of requests retrieving a Feature has resulted in a [`NOT_FOUND` field status.](../user-guide/getting-training-features.md#online-field-statuses) | `project`, `feature_name` |
-| `feast_serving_stale_feature_count` | No. of requests retrieving a Feature resulted in a [`OUTSIDE_MAX_AGE` field status.](../user-guide/getting-training-features.md#online-field-statuses) | `project`, `feature_name` |
-| `feast_serving_grpc_request_count` | Total gRPC requests served. | `method` |
-
-**Metric Tags**
-
-Exported Feast Serving metrics may be filtered by the following tags/keys
-
-| Tag | Description |
-| :--- | :--- |
-| `method` | Name of the Method that the request is calling. \(ie `ListFeatureSets`\) |
-| `status_code` | Status code returned as a result of handling the requests \(ie `OK`\). Can be used to find request failures. |
-| `project` | Name of the project that the FeatureSet of the Feature retrieved belongs to. |
-| `feature_name` | Name of the Feature being retrieved. |
-
-## Feast Ingestion Job
-
-Feast Ingestion computes both metrics an statistics on [data ingestion.](../user-guide/define-and-ingest-features.md) Make sure you familar with data ingestion concepts before proceeding.
-
-**Metrics Namespace**
-
-Metrics are computed at two stages of the Feature Row's/Feature Value's life cycle when being processed by the Ingestion Job:
-
-* `Inflight`- Prior to writing data to stores, but after successful validation of data.
-* `WriteToStoreSucess`- After a successful store write.
-
-Metrics processed by each staged will be tagged with `metrics_namespace` to the stage where the metric was computed.
-
-**Metrics Bucketing**
-
-Metrics with a `{BUCKET}` are computed on a 60 second window/bucket. Suffix with the following to select the bucket to use:
-
-* `min` - minimum value.
-* `max` - maximum value.
-* `mean`- mean value.
-* `percentile_90`- 90 percentile.
-* `percentile_95`- 95 percentile.
-* `percentile_99`- 99 percentile.
-
-**Exported Metrics**
-
-
-
-
-
Metric
-
Description
-
Tags
-
-
-
-
-
feast_ingestion_feature_row_lag_ms_{BUCKET}
-
-
Lag time in milliseconds between succeeding ingested Feature Rows.
-
-**Metric Tags**
-
-Exported Feast Ingestion Job metrics may be filtered by the following tags/keys
-
-| Tag | Description |
-| :--- | :--- |
-| `feast_store` | Name of the target store the Ingestion Job is writing to. |
-| `feast_project_name` | Name of the project that the ingested FeatureSet belongs to. |
-| `feast_featureSet_name` | Name of the Feature Set being ingested. |
-| `feast_feature_name` | Name of the Feature being ingested. |
-| `ingestion_job_name` | Name of the Ingestion Job performing data ingestion. Typically this is set to the Id of the Ingestion Job. |
-| `metrics_namespace` | Stage where metrics where computed. Either `Inflight` or `WriteToStoreSuccess` |
-
diff --git a/docs/reference/offline-stores/README.md b/docs/reference/offline-stores/README.md
index 1260fe8b29..141a34d03b 100644
--- a/docs/reference/offline-stores/README.md
+++ b/docs/reference/offline-stores/README.md
@@ -4,7 +4,8 @@ Please see [Offline Store](../../getting-started/architecture-and-components/off
{% page-ref page="file.md" %}
+{% page-ref page="snowflake.md" %}
+
{% page-ref page="bigquery.md" %}
{% page-ref page="redshift.md" %}
-
diff --git a/docs/reference/offline-stores/snowflake.md b/docs/reference/offline-stores/snowflake.md
new file mode 100644
index 0000000000..aa006b43bb
--- /dev/null
+++ b/docs/reference/offline-stores/snowflake.md
@@ -0,0 +1,34 @@
+# Snowflake
+
+## Description
+
+The Snowflake offline store provides support for reading [SnowflakeSources](../data-sources/snowflake.md).
+
+* Snowflake tables and views are allowed as sources.
+* All joins happen within Snowflake.
+* Entity dataframes can be provided as a SQL query or can be provided as a Pandas dataframe. Pandas dataframes will be uploaded to Snowflake in order to complete join operations.
+* A `SnowflakeRetrievalJob` is returned when calling `get_historical_features()`.
+ * This allows you to call
+ * `to_snowflake` to save the dataset into Snowflake
+ * `to_sql` to get the SQL query that would execute on `to_df`
+ * `to_arrow_chunks` to get the result in batches ([Snowflake python connector docs](https://docs.snowflake.com/en/user-guide/python-connector-api.html#get_result_batches))
+
+## Example
+
+{% code title="feature_store.yaml" %}
+```yaml
+project: my_feature_repo
+registry: data/registry.db
+provider: local
+offline_store:
+ type: snowflake.offline
+ account: snowflake_deployment.us-east-1
+ user: user_login
+ password: user_password
+ role: sysadmin
+ warehouse: demo_wh
+ database: FEAST
+```
+{% endcode %}
+
+Configuration options are available in [SnowflakeOfflineStoreConfig](https://github.com/feast-dev/feast/blob/master/sdk/python/feast/infra/offline_stores/snowflake.py#L56).
diff --git a/docs/reference/offline-stores/untitled.md b/docs/reference/offline-stores/untitled.md
deleted file mode 100644
index 8ffa566a70..0000000000
--- a/docs/reference/offline-stores/untitled.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# BigQuery
-
-### Description
-
-The BigQuery offline store provides support for reading [BigQuerySources](../data-sources/bigquery.md).
-
-* BigQuery tables and views are allowed as sources.
-* All joins happen within BigQuery.
-* Entity dataframes can be provided as a SQL query or can be provided as a Pandas dataframe. Pandas dataframes will be uploaded to BigQuery in order to complete join operations.
-* A [BigQueryRetrievalJob](https://github.com/feast-dev/feast/blob/c50a36ec1ad5b8d81c6f773c23204db7c7a7d218/sdk/python/feast/infra/offline_stores/bigquery.py#L210) is returned when calling `get_historical_features()`.
-
-### Example
-
-{% code title="feature\_store.yaml" %}
-```yaml
-project: my_feature_repo
-registry: gs://my-bucket/data/registry.db
-provider: gcp
-offline_store:
- type: bigquery
- dataset: feast_bq_dataset
-```
-{% endcode %}
-
-Configuration options are available [here](https://rtd.feast.dev/en/latest/#feast.repo_config.BigQueryOfflineStoreConfig).
-
diff --git a/docs/reference/online-stores/README.md b/docs/reference/online-stores/README.md
index aadcc0eb65..2c2902bc57 100644
--- a/docs/reference/online-stores/README.md
+++ b/docs/reference/online-stores/README.md
@@ -9,4 +9,3 @@ Please see [Online Store](../../getting-started/architecture-and-components/onli
{% page-ref page="datastore.md" %}
{% page-ref page="dynamodb.md" %}
-
diff --git a/docs/reference/providers/README.md b/docs/reference/providers/README.md
index 7eb992d5ac..dc52d92726 100644
--- a/docs/reference/providers/README.md
+++ b/docs/reference/providers/README.md
@@ -7,4 +7,3 @@ Please see [Provider](../../getting-started/architecture-and-components/provider
{% page-ref page="google-cloud-platform.md" %}
{% page-ref page="amazon-web-services.md" %}
-
diff --git a/docs/reference/repository-config.md b/docs/reference/repository-config.md
deleted file mode 100644
index 128d773071..0000000000
--- a/docs/reference/repository-config.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Repository Config
-
diff --git a/docs/reference/telemetry.md b/docs/reference/telemetry.md
deleted file mode 100644
index f8f7678764..0000000000
--- a/docs/reference/telemetry.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# Telemetry
-
-### How telemetry is used
-
-The Feast project logs anonymous usage statistics and errors in order to inform our planning. Several client methods are tracked, beginning in Feast 0.9. Users are assigned a UUID which is sent along with the name of the method, the Feast version, the OS \(using `sys.platform`\), and the current time.
-
-The [source code](https://github.com/feast-dev/feast/blob/master/sdk/python/feast/telemetry.py) is available here.
-
-### How to disable telemetry
-
-Set the environment variable `FEAST_TELEMETRY` to `False`.
-
diff --git a/docs/repository-config.md b/docs/repository-config.md
deleted file mode 100644
index 128d773071..0000000000
--- a/docs/repository-config.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Repository Config
-
diff --git a/docs/roadmap.md b/docs/roadmap.md
index 723bfba82a..03ea32a4b2 100644
--- a/docs/roadmap.md
+++ b/docs/roadmap.md
@@ -8,25 +8,27 @@ The list below contains the functionality that contributors are planning to deve
* Want to speak to a Feast contributor? We are more than happy to jump on a call. Please schedule a time using [Calendly](https://calendly.com/d/x2ry-g5bb/meet-with-feast-team).
* **Data Sources**
+ * [x] [Snowflake source](https://docs.feast.dev/reference/data-sources/snowflake)
* [x] [Redshift source](https://docs.feast.dev/reference/data-sources/redshift)
* [x] [BigQuery source](https://docs.feast.dev/reference/data-sources/bigquery)
* [x] [Parquet file source](https://docs.feast.dev/reference/data-sources/file)
* [x] [Synapse source (community plugin)](https://github.com/Azure/feast-azure)
* [x] [Hive (community plugin)](https://github.com/baineng/feast-hive)
* [x] [Postgres (community plugin)](https://github.com/nossrannug/feast-postgres)
- * [x] Kafka source (with [push support into the online store](reference/alpha-stream-ingestion.md))
- * [x] [Snowflake source (community plugin)](https://github.com/sfc-gh-madkins/feast-snowflake)
+ * [x] [Spark (community plugin)](https://github.com/Adyen/feast-spark-offline-store)
+ * [x] Kafka source (with [push support into the online store](https://docs.feast.dev/reference/alpha-stream-ingestion))
* [ ] HTTP source
* **Offline Stores**
+ * [x] [Snowflake](https://docs.feast.dev/reference/offline-stores/snowflake)
* [x] [Redshift](https://docs.feast.dev/reference/offline-stores/redshift)
* [x] [BigQuery](https://docs.feast.dev/reference/offline-stores/bigquery)
* [x] [Synapse (community plugin)](https://github.com/Azure/feast-azure)
* [x] [Hive (community plugin)](https://github.com/baineng/feast-hive)
* [x] [Postgres (community plugin)](https://github.com/nossrannug/feast-postgres)
+ * [x] [Trino (community plugin)](https://github.com/Shopify/feast-trino)
+ * [x] [Spark (community plugin)](https://github.com/Adyen/feast-spark-offline-store)
* [x] [In-memory / Pandas](https://docs.feast.dev/reference/offline-stores/file)
* [x] [Custom offline store support](https://docs.feast.dev/how-to-guides/adding-a-new-offline-store)
- * [x] [Snowflake (community plugin)](https://github.com/sfc-gh-madkins/feast-snowflake)
- * [x] [Trino (communiuty plugin)](https://github.com/Shopify/feast-trino)
* **Online Stores**
* [x] [DynamoDB](https://docs.feast.dev/reference/online-stores/dynamodb)
* [x] [Redis](https://docs.feast.dev/reference/online-stores/redis)
@@ -61,7 +63,7 @@ The list below contains the functionality that contributors are planning to deve
* [ ] Delete API
* [ ] Feature Logging (for training)
* **Data Quality Management (See [RFC](https://docs.google.com/document/d/110F72d4NTv80p35wDSONxhhPBqWRwbZXG4f9mNEMd98/edit))**
- * [ ] Data profiling and validation (Great Expectations) (Planned for Q1 2022)
+ * [x] Data profiling and validation (Great Expectations)
* [ ] Metric production
* [ ] Training-serving skew detection
* [ ] Drift detection
@@ -69,7 +71,7 @@ The list below contains the functionality that contributors are planning to deve
* [x] Python SDK for browsing feature registry
* [x] CLI for browsing feature registry
* [x] Model-centric feature tracking (feature services)
+ * [x] Amundsen integration (see [Feast extractor](https://github.com/amundsen-io/amundsen/blob/main/databuilder/databuilder/extractor/feast_extractor.py))
* [ ] REST API for browsing feature registry
* [ ] Feast Web UI
* [ ] Feature versioning
- * [ ] Amundsen integration
diff --git a/docs/sources.md b/docs/sources.md
deleted file mode 100644
index a76d395d09..0000000000
--- a/docs/sources.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Sources
-
diff --git a/docs/specs/offline_store_format.md b/docs/specs/offline_store_format.md
index 6826c50190..ac829dd52f 100644
--- a/docs/specs/offline_store_format.md
+++ b/docs/specs/offline_store_format.md
@@ -7,8 +7,8 @@ One of the design goals of Feast is being able to plug seamlessly into existing
Feast provides first class support for the following data warehouses (DWH) to store feature data offline out of the box:
* [BigQuery](https://cloud.google.com/bigquery)
-* [Snowflake](https://www.snowflake.com/) (Coming Soon)
-* [Redshift](https://aws.amazon.com/redshift/) (Coming Soon)
+* [Snowflake](https://www.snowflake.com/)
+* [Redshift](https://aws.amazon.com/redshift/)
The integration between Feast and the DWH is highly configurable, but at the same time there are some non-configurable implications and assumptions that Feast imposes on table schemas and mapping between database-native types and Feast type system. This is what this document is about.
@@ -28,14 +28,14 @@ Feature data is stored in tables in the DWH. There is one DWH table per Feast Fe
## Type mappings
#### Pandas types
-Here's how Feast types map to Pandas types for Feast APIs that take in or return a Pandas dataframe:
+Here's how Feast types map to Pandas types for Feast APIs that take in or return a Pandas dataframe:
| Feast Type | Pandas Type |
|-------------|--|
| Event Timestamp | `datetime64[ns]` |
| BYTES | `bytes` |
| STRING | `str` , `category`|
-| INT32 | `int32`, `uint32` |
+| INT32 | `int16`, `uint16`, `int32`, `uint32` |
| INT64 | `int64`, `uint64` |
| UNIX_TIMESTAMP | `datetime64[ns]`, `datetime64[ns, tz]` |
| DOUBLE | `float64` |
@@ -80,3 +80,17 @@ Here's how Feast types map to BigQuery types when using BigQuery for offline sto
| BOOL\_LIST | `ARRAY`|
Values that are not specified by the table above will cause an error on conversion.
+
+#### Snowflake Types
+Here's how Feast types map to Snowflake types when using Snowflake for offline storage
+See source here:
+https://docs.snowflake.com/en/user-guide/python-connector-pandas.html#snowflake-to-pandas-data-mapping
+
+| Feast Type | Snowflake Python Type |
+|-------------|--|
+| Event Timestamp | `DATETIME64[NS]` |
+| UNIX_TIMESTAMP | `DATETIME64[NS]` |
+| STRING | `STR` |
+| INT32 | `INT8 / UINT8 / INT16 / UINT16 / INT32 / UINT32` |
+| INT64 | `INT64 / UINT64` |
+| DOUBLE | `FLOAT64` |
diff --git a/docs/tutorials/driver-stats-on-snowflake.md b/docs/tutorials/driver-stats-on-snowflake.md
new file mode 100644
index 0000000000..94ac109c94
--- /dev/null
+++ b/docs/tutorials/driver-stats-on-snowflake.md
@@ -0,0 +1,130 @@
+---
+description: >-
+ Initial demonstration of Snowflake as an offline store with Feast, using the Snowflake demo template.
+---
+
+# Drivers stats on Snowflake
+
+In the steps below, we will set up a sample Feast project that leverages Snowflake
+as an offline store.
+
+Starting with data in a Snowflake table, we will register that table to the feature store and define features associated with the columns in that table. From there, we will generate historical training data based on those feature definitions and then materialize the latest feature values into the online store. Lastly, we will retrieve the materialized feature values.
+
+Our template will generate new data containing driver statistics. From there, we will show you code snippets that will call to the offline store for generating training datasets, and then the code for calling the online store to serve you the latest feature values to serve models in production.
+
+## Snowflake Offline Store Example
+
+#### Install feast-snowflake
+
+```shell
+pip install 'feast[snowflake]'
+```
+
+#### Get a Snowflake Trial Account (Optional)
+
+[Snowflake Trial Account](http://trial.snowflake.com)
+
+#### Create a feature repository
+
+```shell
+feast init -t snowflake {feature_repo_name}
+Snowflake Deployment URL (exclude .snowflakecomputing.com):
+Snowflake User Name::
+Snowflake Password::
+Snowflake Role Name (Case Sensitive)::
+Snowflake Warehouse Name (Case Sensitive)::
+Snowflake Database Name (Case Sensitive)::
+Should I upload example data to Snowflake (overwrite table)? [Y/n]: Y
+cd {feature_repo_name}
+```
+
+The following files will automatically be created in your project folder:
+
+* feature_store.yaml -- This is your main configuration file
+* driver_repo.py -- This is your main feature definition file
+* test.py -- This is a file to test your feature store configuration
+
+#### Inspect `feature_store.yaml`
+
+Here you will see the information that you entered. This template will use Snowflake as an offline store and SQLite as the online store. The main thing to remember is by default, Snowflake objects have ALL CAPS names unless lower case was specified.
+
+{% code title="feature_store.yaml" %}
+```yaml
+project: ...
+registry: ...
+provider: local
+offline_store:
+ type: snowflake.offline
+ account: SNOWFLAKE_DEPLOYMENT_URL #drop .snowflakecomputing.com
+ user: USERNAME
+ password: PASSWORD
+ role: ROLE_NAME #case sensitive
+ warehouse: WAREHOUSE_NAME #case sensitive
+ database: DATABASE_NAME #case cap sensitive
+```
+{% endcode %}
+
+#### Run our test python script `test.py`
+
+```shell
+python test.py
+```
+
+## What we did in `test.py`
+
+#### Initialize our Feature Store
+{% code title="test.py" %}
+```python
+from datetime import datetime, timedelta
+
+import pandas as pd
+from driver_repo import driver, driver_stats_fv
+
+from feast import FeatureStore
+
+fs = FeatureStore(repo_path=".")
+
+fs.apply([driver, driver_stats_fv])
+```
+{% endcode %}
+
+#### Create a dummy training dataframe, then call our offline store to add additional columns
+{% code title="test.py" %}
+```python
+entity_df = pd.DataFrame(
+ {
+ "event_timestamp": [
+ pd.Timestamp(dt, unit="ms", tz="UTC").round("ms")
+ for dt in pd.date_range(
+ start=datetime.now() - timedelta(days=3),
+ end=datetime.now(),
+ periods=3,
+ )
+ ],
+ "driver_id": [1001, 1002, 1003],
+ }
+)
+
+features = ["driver_hourly_stats:conv_rate", "driver_hourly_stats:acc_rate"]
+
+training_df = fs.get_historical_features(
+ features=features, entity_df=entity_df
+).to_df()
+```
+{% endcode %}
+
+#### Materialize the latest feature values into our online store
+{% code title="test.py" %}
+```python
+fs.materialize_incremental(end_date=datetime.now())
+```
+{% endcode %}
+
+#### Retrieve the latest values from our online store based on our entity key
+{% code title="test.py" %}
+```python
+online_features = fs.get_online_features(
+ features=features, entity_rows=[{"driver_id": 1001}, {"driver_id": 1002}],
+).to_dict()
+```
+{% endcode %}
diff --git a/docs/tutorials/tutorials-overview.md b/docs/tutorials/tutorials-overview.md
index a523f9b38e..32e64071b0 100644
--- a/docs/tutorials/tutorials-overview.md
+++ b/docs/tutorials/tutorials-overview.md
@@ -8,3 +8,6 @@ These Feast tutorials showcase how to use Feast to simplify end to end model tra
{% page-ref page="real-time-credit-scoring-on-aws.md" %}
+{% page-ref page="driver-stats-on-snowflake.md" %}
+
+{% page-ref page="validating-historical-features.md" %}
diff --git a/docs/tutorials/validating-historical-features.md b/docs/tutorials/validating-historical-features.md
new file mode 100644
index 0000000000..19ae4ef434
--- /dev/null
+++ b/docs/tutorials/validating-historical-features.md
@@ -0,0 +1,915 @@
+# Validating historical features with Great Expectations
+
+In this tutorial, we will use the public dataset of Chicago taxi trips to present data validation capabilities of Feast.
+- The original dataset is stored in BigQuery and consists of raw data for each taxi trip (one row per trip) since 2013.
+- We will generate several training datasets (aka historical features in Feast) for different periods and evaluate expectations made on one dataset against another.
+
+Types of features we're ingesting and generating:
+- Features that aggregate raw data with daily intervals (eg, trips per day, average fare or speed for a specific day, etc.).
+- Features using SQL while pulling data from BigQuery (like total trips time or total miles travelled).
+- Features calculated on the fly when requested using Feast's on-demand transformations
+
+Our plan:
+
+0. Prepare environment
+1. Pull data from BigQuery (optional)
+2. Declare & apply features and feature views in Feast
+3. Generate reference dataset
+4. Develop & test profiler function
+5. Run validation on different dataset using reference dataset & profiler
+
+
+> The original notebook and datasets for this tutorial can be found on [GitHub](https://github.com/feast-dev/dqm-tutorial).
+
+### 0. Setup
+
+Install Feast Python SDK and great expectations:
+
+
+```python
+!pip install 'feast[ge]'
+```
+
+
+### 1. Dataset preparation (Optional)
+
+**You can skip this step if you don't have GCP account. Please use parquet files that are coming with this tutorial instead**
+
+
+```python
+!pip install google-cloud-bigquery
+```
+
+
+```python
+import pyarrow.parquet
+
+from google.cloud.bigquery import Client
+```
+
+
+```python
+bq_client = Client(project='kf-feast')
+```
+
+Running some basic aggregations while pulling data from BigQuery. Grouping by taxi_id and day:
+
+
+```python
+data_query = """SELECT
+ taxi_id,
+ TIMESTAMP_TRUNC(trip_start_timestamp, DAY) as day,
+ SUM(trip_miles) as total_miles_travelled,
+ SUM(trip_seconds) as total_trip_seconds,
+ SUM(fare) as total_earned,
+ COUNT(*) as trip_count
+FROM `bigquery-public-data.chicago_taxi_trips.taxi_trips`
+WHERE
+ trip_miles > 0 AND trip_seconds > 60 AND
+ trip_start_timestamp BETWEEN '2019-01-01' and '2020-12-31' AND
+ trip_total < 1000
+GROUP BY taxi_id, TIMESTAMP_TRUNC(trip_start_timestamp, DAY)"""
+```
+
+
+```python
+driver_stats_table = bq_client.query(data_query).to_arrow()
+
+# Storing resulting dataset into parquet file
+pyarrow.parquet.write_table(driver_stats_table, "trips_stats.parquet")
+```
+
+
+```python
+def entities_query(year):
+ return f"""SELECT
+ distinct taxi_id
+FROM `bigquery-public-data.chicago_taxi_trips.taxi_trips`
+WHERE
+ trip_miles > 0 AND trip_seconds > 0 AND
+ trip_start_timestamp BETWEEN '{year}-01-01' and '{year}-12-31'
+"""
+```
+
+
+```python
+entities_2019_table = bq_client.query(entities_query(2019)).to_arrow()
+
+# Storing entities (taxi ids) into parquet file
+pyarrow.parquet.write_table(entities_2019_table, "entities.parquet")
+```
+
+
+## 2. Declaring features
+
+
+```python
+import pyarrow.parquet
+import pandas as pd
+
+from feast import Feature, FeatureView, Entity, FeatureStore
+from feast.value_type import ValueType
+from feast.data_format import ParquetFormat
+from feast.on_demand_feature_view import on_demand_feature_view
+from feast.infra.offline_stores.file_source import FileSource
+from feast.infra.offline_stores.file import SavedDatasetFileStorage
+
+from google.protobuf.duration_pb2 import Duration
+```
+
+
+```python
+batch_source = FileSource(
+ event_timestamp_column="day",
+ path="trips_stats.parquet", # using parquet file that we created on previous step
+ file_format=ParquetFormat()
+)
+```
+
+
+```python
+taxi_entity = Entity(name='taxi', join_key='taxi_id')
+```
+
+
+```python
+trips_stats_fv = FeatureView(
+ name='trip_stats',
+ entities=['taxi'],
+ features=[
+ Feature("total_miles_travelled", ValueType.DOUBLE),
+ Feature("total_trip_seconds", ValueType.DOUBLE),
+ Feature("total_earned", ValueType.DOUBLE),
+ Feature("trip_count", ValueType.INT64),
+
+ ],
+ ttl=Duration(seconds=86400),
+ batch_source=batch_source,
+)
+```
+
+*Read more about feature views in [Feast docs](https://docs.feast.dev/getting-started/concepts/feature-view)*
+
+
+```python
+@on_demand_feature_view(
+ features=[
+ Feature("avg_fare", ValueType.DOUBLE),
+ Feature("avg_speed", ValueType.DOUBLE),
+ Feature("avg_trip_seconds", ValueType.DOUBLE),
+ Feature("earned_per_hour", ValueType.DOUBLE),
+ ],
+ inputs={
+ "stats": trips_stats_fv
+ }
+)
+def on_demand_stats(inp):
+ out = pd.DataFrame()
+ out["avg_fare"] = inp["total_earned"] / inp["trip_count"]
+ out["avg_speed"] = 3600 * inp["total_miles_travelled"] / inp["total_trip_seconds"]
+ out["avg_trip_seconds"] = inp["total_trip_seconds"] / inp["trip_count"]
+ out["earned_per_hour"] = 3600 * inp["total_earned"] / inp["total_trip_seconds"]
+ return out
+```
+
+*Read more about on demand feature views [here](https://docs.feast.dev/reference/alpha-on-demand-feature-view)*
+
+
+```python
+store = FeatureStore(".") # using feature_store.yaml that stored in the same directory
+```
+
+
+```python
+store.apply([taxi_entity, trips_stats_fv, on_demand_stats]) # writing to the registry
+```
+
+
+## 3. Generating training (reference) dataset
+
+
+```python
+taxi_ids = pyarrow.parquet.read_table("entities.parquet").to_pandas()
+```
+
+Generating range of timestamps with daily frequency:
+
+
+```python
+timestamps = pd.DataFrame()
+timestamps["event_timestamp"] = pd.date_range("2019-06-01", "2019-07-01", freq='D')
+```
+
+Cross merge (aka relation multiplication) produces entity dataframe with each taxi_id repeated for each timestamp:
+
+
+```python
+entity_df = pd.merge(taxi_ids, timestamps, how='cross')
+entity_df
+```
+
+
+
+
+
+
+
+
+
+
taxi_id
+
event_timestamp
+
+
+
+
+
0
+
91d5288487e87c5917b813ba6f75ab1c3a9749af906a2d...
+
2019-06-01
+
+
+
1
+
91d5288487e87c5917b813ba6f75ab1c3a9749af906a2d...
+
2019-06-02
+
+
+
2
+
91d5288487e87c5917b813ba6f75ab1c3a9749af906a2d...
+
2019-06-03
+
+
+
3
+
91d5288487e87c5917b813ba6f75ab1c3a9749af906a2d...
+
2019-06-04
+
+
+
4
+
91d5288487e87c5917b813ba6f75ab1c3a9749af906a2d...
+
2019-06-05
+
+
+
...
+
...
+
...
+
+
+
156979
+
7ebf27414a0c7b128e7925e1da56d51a8b81484f7630cf...
+
2019-06-27
+
+
+
156980
+
7ebf27414a0c7b128e7925e1da56d51a8b81484f7630cf...
+
2019-06-28
+
+
+
156981
+
7ebf27414a0c7b128e7925e1da56d51a8b81484f7630cf...
+
2019-06-29
+
+
+
156982
+
7ebf27414a0c7b128e7925e1da56d51a8b81484f7630cf...
+
2019-06-30
+
+
+
156983
+
7ebf27414a0c7b128e7925e1da56d51a8b81484f7630cf...
+
2019-07-01
+
+
+
+
156984 rows × 2 columns
+
+
+
+
+Retrieving historical features for resulting entity dataframe and persisting output as a saved dataset:
+
+
+```python
+job = store.get_historical_features(
+ entity_df=entity_df,
+ features=[
+ "trip_stats:total_miles_travelled",
+ "trip_stats:total_trip_seconds",
+ "trip_stats:total_earned",
+ "trip_stats:trip_count",
+ "on_demand_stats:avg_fare",
+ "on_demand_stats:avg_trip_seconds",
+ "on_demand_stats:avg_speed",
+ "on_demand_stats:earned_per_hour",
+ ]
+)
+
+store.create_saved_dataset(
+ from_=job,
+ name='my_training_ds',
+ storage=SavedDatasetFileStorage(path='my_training_ds.parquet')
+)
+```
+
+```python
+, full_feature_names = False, tags = {}, _retrieval_job = , min_event_timestamp = 2019-06-01 00:00:00, max_event_timestamp = 2019-07-01 00:00:00)>
+```
+
+
+## 4. Developing dataset profiler
+
+Dataset profiler is a function that accepts dataset and generates set of its characteristics. This charasteristics will be then used to evaluate (validate) next datasets.
+
+**Important: datasets are not compared to each other!
+Feast use a reference dataset and a profiler function to generate a reference profile.
+This profile will be then used during validation of the tested dataset.**
+
+
+```python
+import numpy as np
+
+from feast.dqm.profilers.ge_profiler import ge_profiler
+
+from great_expectations.core.expectation_suite import ExpectationSuite
+from great_expectations.dataset import PandasDataset
+```
+
+
+Loading saved dataset first and exploring the data:
+
+
+```python
+ds = store.get_saved_dataset('my_training_ds')
+ds.to_df()
+```
+
+
+
+
+
+
+
total_earned
+
avg_trip_seconds
+
taxi_id
+
total_miles_travelled
+
trip_count
+
earned_per_hour
+
event_timestamp
+
total_trip_seconds
+
avg_fare
+
avg_speed
+
+
+
+
+
0
+
68.25
+
2270.000000
+
91d5288487e87c5917b813ba6f75ab1c3a9749af906a2d...
+
24.70
+
2.0
+
54.118943
+
2019-06-01 00:00:00+00:00
+
4540.0
+
34.125000
+
19.585903
+
+
+
1
+
221.00
+
560.500000
+
7a4a6162eaf27805aef407d25d5cb21fe779cd962922cb...
+
54.18
+
24.0
+
59.143622
+
2019-06-01 00:00:00+00:00
+
13452.0
+
9.208333
+
14.499554
+
+
+
2
+
160.50
+
1010.769231
+
f4c9d05b215d7cbd08eca76252dae51cdb7aca9651d4ef...
+
41.30
+
13.0
+
43.972603
+
2019-06-01 00:00:00+00:00
+
13140.0
+
12.346154
+
11.315068
+
+
+
3
+
183.75
+
697.550000
+
c1f533318f8480a59173a9728ea0248c0d3eb187f4b897...
+
37.30
+
20.0
+
47.415956
+
2019-06-01 00:00:00+00:00
+
13951.0
+
9.187500
+
9.625116
+
+
+
4
+
217.75
+
1054.076923
+
455b6b5cae6ca5a17cddd251485f2266d13d6a2c92f07c...
+
69.69
+
13.0
+
57.206451
+
2019-06-01 00:00:00+00:00
+
13703.0
+
16.750000
+
18.308692
+
+
+
...
+
...
+
...
+
...
+
...
+
...
+
...
+
...
+
...
+
...
+
...
+
+
+
156979
+
38.00
+
1980.000000
+
0cccf0ec1f46d1e0beefcfdeaf5188d67e170cdff92618...
+
14.90
+
1.0
+
69.090909
+
2019-07-01 00:00:00+00:00
+
1980.0
+
38.000000
+
27.090909
+
+
+
156980
+
135.00
+
551.250000
+
beefd3462e3f5a8e854942a2796876f6db73ebbd25b435...
+
28.40
+
16.0
+
55.102041
+
2019-07-01 00:00:00+00:00
+
8820.0
+
8.437500
+
11.591837
+
+
+
156981
+
NaN
+
NaN
+
9a3c52aa112f46cf0d129fafbd42051b0fb9b0ff8dcb0e...
+
NaN
+
NaN
+
NaN
+
2019-07-01 00:00:00+00:00
+
NaN
+
NaN
+
NaN
+
+
+
156982
+
63.00
+
815.000000
+
08308c31cd99f495dea73ca276d19a6258d7b4c9c88e43...
+
19.96
+
4.0
+
69.570552
+
2019-07-01 00:00:00+00:00
+
3260.0
+
15.750000
+
22.041718
+
+
+
156983
+
NaN
+
NaN
+
7ebf27414a0c7b128e7925e1da56d51a8b81484f7630cf...
+
NaN
+
NaN
+
NaN
+
2019-07-01 00:00:00+00:00
+
NaN
+
NaN
+
NaN
+
+
+
+
156984 rows × 10 columns
+
+
+
+
+Feast uses [Great Expectations](https://docs.greatexpectations.io/docs/) as a validation engine and [ExpectationSuite](https://legacy.docs.greatexpectations.io/en/latest/autoapi/great_expectations/core/expectation_suite/index.html#great_expectations.core.expectation_suite.ExpectationSuite) as a dataset's profile. Hence, we need to develop a function that will generate ExpectationSuite. This function will receive instance of [PandasDataset](https://legacy.docs.greatexpectations.io/en/latest/autoapi/great_expectations/dataset/index.html?highlight=pandasdataset#great_expectations.dataset.PandasDataset) (wrapper around pandas.DataFrame) so we can utilize both Pandas DataFrame API and some helper functions from PandasDataset during profiling.
+
+
+```python
+DELTA = 0.1 # controlling allowed window in fraction of the value on scale [0, 1]
+
+@ge_profiler
+def stats_profiler(ds: PandasDataset) -> ExpectationSuite:
+ # simple checks on data consistency
+ ds.expect_column_values_to_be_between(
+ "avg_speed",
+ min_value=0,
+ max_value=60,
+ mostly=0.99 # allow some outliers
+ )
+
+ ds.expect_column_values_to_be_between(
+ "total_miles_travelled",
+ min_value=0,
+ max_value=500,
+ mostly=0.99 # allow some outliers
+ )
+
+ # expectation of means based on observed values
+ observed_mean = ds.trip_count.mean()
+ ds.expect_column_mean_to_be_between("trip_count",
+ min_value=observed_mean * (1 - DELTA),
+ max_value=observed_mean * (1 + DELTA))
+
+ observed_mean = ds.earned_per_hour.mean()
+ ds.expect_column_mean_to_be_between("earned_per_hour",
+ min_value=observed_mean * (1 - DELTA),
+ max_value=observed_mean * (1 + DELTA))
+
+
+ # expectation of quantiles
+ qs = [0.5, 0.75, 0.9, 0.95]
+ observed_quantiles = ds.avg_fare.quantile(qs)
+
+ ds.expect_column_quantile_values_to_be_between(
+ "avg_fare",
+ quantile_ranges={
+ "quantiles": qs,
+ "value_ranges": [[None, max_value] for max_value in observed_quantiles]
+ })
+
+ return ds.get_expectation_suite()
+```
+
+Testing our profiler function:
+
+
+```python
+ds.get_profile(profiler=stats_profiler)
+```
+ 02/02/2022 02:43:47 PM INFO: 5 expectation(s) included in expectation_suite. result_format settings filtered.
+
+
+
+
+**Verify that all expectations that we coded in our profiler are present here. Otherwise (if you can't find some expectations) it means that it failed to pass on the reference dataset (do it silently is default behavior of Great Expectations).**
+
+Now we can create validation reference from dataset and profiler function:
+
+
+```python
+validation_reference = ds.as_reference(profiler=stats_profiler)
+```
+
+and test it against our existing retrieval job
+
+
+```python
+_ = job.to_df(validation_reference=validation_reference)
+```
+
+ 02/02/2022 02:43:52 PM INFO: 5 expectation(s) included in expectation_suite. result_format settings filtered.
+ 02/02/2022 02:43:53 PM INFO: Validating data_asset_name None with expectation_suite_name default
+
+
+Validation successfully passed as no exception were raised.
+
+
+### 5. Validating new historical retrieval
+
+Creating new timestamps for Dec 2020:
+
+
+```python
+from feast.dqm.errors import ValidationFailed
+```
+
+
+```python
+timestamps = pd.DataFrame()
+timestamps["event_timestamp"] = pd.date_range("2020-12-01", "2020-12-07", freq='D')
+```
+
+
+```python
+entity_df = pd.merge(taxi_ids, timestamps, how='cross')
+entity_df
+```
+
+
+
+
+
+
+
taxi_id
+
event_timestamp
+
+
+
+
+
0
+
91d5288487e87c5917b813ba6f75ab1c3a9749af906a2d...
+
2020-12-01
+
+
+
1
+
91d5288487e87c5917b813ba6f75ab1c3a9749af906a2d...
+
2020-12-02
+
+
+
2
+
91d5288487e87c5917b813ba6f75ab1c3a9749af906a2d...
+
2020-12-03
+
+
+
3
+
91d5288487e87c5917b813ba6f75ab1c3a9749af906a2d...
+
2020-12-04
+
+
+
4
+
91d5288487e87c5917b813ba6f75ab1c3a9749af906a2d...
+
2020-12-05
+
+
+
...
+
...
+
...
+
+
+
35443
+
7ebf27414a0c7b128e7925e1da56d51a8b81484f7630cf...
+
2020-12-03
+
+
+
35444
+
7ebf27414a0c7b128e7925e1da56d51a8b81484f7630cf...
+
2020-12-04
+
+
+
35445
+
7ebf27414a0c7b128e7925e1da56d51a8b81484f7630cf...
+
2020-12-05
+
+
+
35446
+
7ebf27414a0c7b128e7925e1da56d51a8b81484f7630cf...
+
2020-12-06
+
+
+
35447
+
7ebf27414a0c7b128e7925e1da56d51a8b81484f7630cf...
+
2020-12-07
+
+
+
+
35448 rows × 2 columns
+
+
+
+```python
+job = store.get_historical_features(
+ entity_df=entity_df,
+ features=[
+ "trip_stats:total_miles_travelled",
+ "trip_stats:total_trip_seconds",
+ "trip_stats:total_earned",
+ "trip_stats:trip_count",
+ "on_demand_stats:avg_fare",
+ "on_demand_stats:avg_trip_seconds",
+ "on_demand_stats:avg_speed",
+ "on_demand_stats:earned_per_hour",
+ ]
+)
+```
+
+Execute retrieval job with validation reference:
+
+
+```python
+try:
+ df = job.to_df(validation_reference=validation_reference)
+except ValidationFailed as exc:
+ print(exc.validation_report)
+```
+
+ 02/02/2022 02:43:58 PM INFO: 5 expectation(s) included in expectation_suite. result_format settings filtered.
+ 02/02/2022 02:43:59 PM INFO: Validating data_asset_name None with expectation_suite_name default
+
+ [
+ {
+ "expectation_config": {
+ "expectation_type": "expect_column_mean_to_be_between",
+ "kwargs": {
+ "column": "trip_count",
+ "min_value": 10.387244591346153,
+ "max_value": 12.695521167200855,
+ "result_format": "COMPLETE"
+ },
+ "meta": {}
+ },
+ "meta": {},
+ "result": {
+ "observed_value": 6.692920555429092,
+ "element_count": 35448,
+ "missing_count": 31055,
+ "missing_percent": 87.6071992778154
+ },
+ "exception_info": {
+ "raised_exception": false,
+ "exception_message": null,
+ "exception_traceback": null
+ },
+ "success": false
+ },
+ {
+ "expectation_config": {
+ "expectation_type": "expect_column_mean_to_be_between",
+ "kwargs": {
+ "column": "earned_per_hour",
+ "min_value": 52.320624975640214,
+ "max_value": 63.94743052578249,
+ "result_format": "COMPLETE"
+ },
+ "meta": {}
+ },
+ "meta": {},
+ "result": {
+ "observed_value": 68.99268345164135,
+ "element_count": 35448,
+ "missing_count": 31055,
+ "missing_percent": 87.6071992778154
+ },
+ "exception_info": {
+ "raised_exception": false,
+ "exception_message": null,
+ "exception_traceback": null
+ },
+ "success": false
+ },
+ {
+ "expectation_config": {
+ "expectation_type": "expect_column_quantile_values_to_be_between",
+ "kwargs": {
+ "column": "avg_fare",
+ "quantile_ranges": {
+ "quantiles": [
+ 0.5,
+ 0.75,
+ 0.9,
+ 0.95
+ ],
+ "value_ranges": [
+ [
+ null,
+ 16.4
+ ],
+ [
+ null,
+ 26.229166666666668
+ ],
+ [
+ null,
+ 36.4375
+ ],
+ [
+ null,
+ 42.0
+ ]
+ ]
+ },
+ "result_format": "COMPLETE"
+ },
+ "meta": {}
+ },
+ "meta": {},
+ "result": {
+ "observed_value": {
+ "quantiles": [
+ 0.5,
+ 0.75,
+ 0.9,
+ 0.95
+ ],
+ "values": [
+ 19.5,
+ 28.1,
+ 38.0,
+ 44.125
+ ]
+ },
+ "element_count": 35448,
+ "missing_count": 31055,
+ "missing_percent": 87.6071992778154,
+ "details": {
+ "success_details": [
+ false,
+ false,
+ false,
+ false
+ ]
+ }
+ },
+ "exception_info": {
+ "raised_exception": false,
+ "exception_message": null,
+ "exception_traceback": null
+ },
+ "success": false
+ }
+ ]
+
+
+Validation failed since several expectations didn't pass:
+* Trip count (mean) decreased more than 10% (which is expected when comparing Dec 2020 vs June 2019)
+* Average Fare increased - all quantiles are higher than expected
+* Earn per hour (mean) increased more than 10% (most probably due to increased fare)
+
diff --git a/docs/user-guide/define-and-ingest-features.md b/docs/user-guide/define-and-ingest-features.md
deleted file mode 100644
index d55fcb1d85..0000000000
--- a/docs/user-guide/define-and-ingest-features.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# Define and ingest features
-
-In order to retrieve features for both training and serving, Feast requires data being ingested into its offline and online stores.
-
-{% hint style="warning" %}
-Feast 0.8 does not have an offline store. Only Online storage support exists currently. Feast 0.9 will have offline storage support. In Feast 0.8, historical data is retrieved directly from batch sources.
-{% endhint %}
-
-Users are expected to already have either a batch or stream source with data stored in it, ready to be ingested into Feast. Once a feature table \(with the corresponding sources\) has been registered with Feast, it is possible to load data from this source into stores.
-
-The following depicts an example ingestion flow from a data source to the online store.
-
-### Batch Source to Online Store
-
-```python
-from feast import Client
-from datetime import datetime, timedelta
-
-client = Client(core_url="localhost:6565")
-driver_ft = client.get_feature_table("driver_trips")
-
-# Initialize date ranges
-today = datetime.now()
-yesterday = today - timedelta(1)
-
-# Launches a short-lived job that ingests data over the provided date range.
-client.start_offline_to_online_ingestion(
- driver_ft, yesterday, today
-)
-```
-
-### Stream Source to Online Store
-
-```python
-from feast import Client
-from datetime import datetime, timedelta
-
-client = Client(core_url="localhost:6565")
-driver_ft = client.get_feature_table("driver_trips")
-
-# Launches a long running streaming ingestion job
-client.start_stream_to_online_ingestion(driver_ft)
-```
-
-### Batch Source to Offline Store
-
-{% hint style="danger" %}
-Not supported in Feast 0.8
-{% endhint %}
-
-### Stream Source to Offline Store
-
-{% hint style="danger" %}
-Not supported in Feast 0.8
-{% endhint %}
-
diff --git a/docs/user-guide/getting-online-features.md b/docs/user-guide/getting-online-features.md
deleted file mode 100644
index c16dc08a01..0000000000
--- a/docs/user-guide/getting-online-features.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# Getting online features
-
-Feast provides an API through which online feature values can be retrieved. This allows teams to look up feature values at low latency in production during model serving, in order to make online predictions.
-
-{% hint style="info" %}
-Online stores only maintain the current state of features, i.e latest feature values. No historical data is stored or served.
-{% endhint %}
-
-```python
-from feast import Client
-
-online_client = Client(
- core_url="localhost:6565",
- serving_url="localhost:6566",
-)
-
-entity_rows = [
- {"driver_id": 1001},
- {"driver_id": 1002},
-]
-
-# Features in format
-feature_refs = [
- "driver_trips:average_daily_rides",
- "driver_trips:maximum_daily_rides",
- "driver_trips:rating",
-]
-
-response = online_client.get_online_features(
- feature_refs=feature_refs, # Contains only feature references
- entity_rows=entity_rows, # Contains only entities (driver ids)
-)
-
-# Print features in dictionary format
-response_dict = response.to_dict()
-print(response_dict)
-```
-
-The online store must be populated through [ingestion jobs](define-and-ingest-features.md#batch-source-to-online-store) prior to being used for online serving.
-
-Feast Serving provides a [gRPC API](https://api.docs.feast.dev/grpc/feast.serving.pb.html) that is backed by [Redis](https://redis.io/). We have native clients in [Python](https://api.docs.feast.dev/python/), [Go](https://godoc.org/github.com/gojek/feast/sdk/go), and [Java](https://javadoc.io/doc/dev.feast).
-
-### Online Field Statuses
-
-Feast also returns status codes when retrieving features from the Feast Serving API. These status code give useful insight into the quality of data being served.
-
-| Status | Meaning |
-| :--- | :--- |
-| NOT\_FOUND | The feature value was not found in the online store. This might mean that no feature value was ingested for this feature. |
-| NULL\_VALUE | A entity key was successfully found but no feature values had been set. This status code should not occur during normal operation. |
-| OUTSIDE\_MAX\_AGE | The age of the feature row in the online store \(in terms of its event timestamp\) has exceeded the maximum age defined within the feature table. |
-| PRESENT | The feature values have been found and are within the maximum age. |
-| UNKNOWN | Indicates a system failure. |
-
diff --git a/docs/user-guide/getting-training-features.md b/docs/user-guide/getting-training-features.md
deleted file mode 100644
index b9d0b050f2..0000000000
--- a/docs/user-guide/getting-training-features.md
+++ /dev/null
@@ -1,72 +0,0 @@
-# Getting training features
-
-Feast provides a historical retrieval interface for exporting feature data in order to train machine learning models. Essentially, users are able to enrich their data with features from any feature tables.
-
-### Retrieving historical features
-
-Below is an example of the process required to produce a training dataset:
-
-```python
-# Feature references with target feature
-features = [
- "driver_trips:average_daily_rides",
- "driver_trips:maximum_daily_rides",
- "driver_trips:rating",
- "driver_trips:rating:trip_completed",
-]
-
-# Define entity source
-entity_source = FileSource(
- "event_timestamp",
- ParquetFormat(),
- "gs://some-bucket/customer"
-)
-
-# Retrieve historical dataset from Feast.
-historical_feature_retrieval_job = client.get_historical_features(
- features=features,
- entity_rows=entity_source
-)
-
-output_file_uri = historical_feature_retrieval_job.get_output_file_uri()
-```
-
-#### 1. Define feature references
-
-[Feature references](../concepts/glossary.md#feature-references) define the specific features that will be retrieved from Feast. These features can come from multiple feature tables. The only requirement is that the feature tables that make up the feature references have the same entity \(or composite entity\).
-
-**2. Define an entity dataframe**
-
-Feast needs to join feature values onto specific entities at specific points in time. Thus, it is necessary to provide an [entity dataframe](../concepts/glossary.md#entity-dataframe) as part of the `get_historical_features` method. In the example above we are defining an entity source. This source is an external file that provides Feast with the entity dataframe.
-
-**3. Launch historical retrieval job**
-
-Once the feature references and an entity source are defined, it is possible to call `get_historical_features()`. This method launches a job that extracts features from the sources defined in the provided feature tables, joins them onto the provided entity source, and returns a reference to the training dataset that is produced.
-
-Please see the [Feast SDK](https://api.docs.feast.dev/python) for more details.
-
-### Point-in-time Joins
-
-Feast always joins features onto entity data in a point-in-time correct way. The process can be described through an example.
-
-In the example below there are two tables \(or dataframes\):
-
-* The dataframe on the left is the [entity dataframe](../concepts/glossary.md#entity-dataframe) that contains timestamps, entities, and the target variable \(trip\_completed\). This dataframe is provided to Feast through an entity source.
-* The dataframe on the right contains driver features. This dataframe is represented in Feast through a feature table and its accompanying data source\(s\).
-
-The user would like to have the driver features joined onto the entity dataframe to produce a training dataset that contains both the target \(trip\_completed\) and features \(average\_daily\_rides, maximum\_daily\_rides, rating\). This dataset will then be used to train their model.
-
-![](../.gitbook/assets/point_in_time_join%20%281%29%20%282%29%20%282%29%20%283%29%20%283%29%20%283%29%20%283%29%20%281%29.png)
-
-Feast is able to intelligently join feature data with different timestamps to a single entity dataframe. It does this through a point-in-time join as follows:
-
-1. Feast loads the entity dataframe and all feature tables \(driver dataframe\) into the same location. This can either be a database or in memory.
-2. For each [entity row](../concepts/glossary.md#entity-rows) in the [entity dataframe](getting-online-features.md), Feast tries to find feature values in each feature table to join to it. Feast extracts the timestamp and entity key of each row in the entity dataframe and scans backward through the feature table until it finds a matching entity key.
-3. If the event timestamp of the matching entity key within the driver feature table is within the maximum age configured for the feature table, then the features at that entity key are joined onto the entity dataframe. If the event timestamp is outside of the maximum age, then only null values are returned.
-4. If multiple entity keys are found with the same event timestamp, then they are deduplicated by the created timestamp, with newer values taking precedence.
-5. Feast repeats this joining process for all feature tables and returns the resulting dataset.
-
-{% hint style="info" %}
-Point-in-time correct joins attempts to prevent the occurrence of feature leakage by trying to recreate the state of the world at a single point in time, instead of joining features based on exact timestamps only.
-{% endhint %}
-
diff --git a/docs/user-guide/overview.md b/docs/user-guide/overview.md
deleted file mode 100644
index 2d6eb9981b..0000000000
--- a/docs/user-guide/overview.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# Overview
-
-### Using Feast
-
-Feast development happens through three key workflows:
-
-1. [Define and load feature data into Feast](define-and-ingest-features.md)
-2. [Retrieve historical features for training models](getting-training-features.md)
-3. [Retrieve online features for serving models](getting-online-features.md)
-
-### Defining feature tables and ingesting data into Feast
-
-Feature creators model the data within their organization into Feast through the definition of [feature tables](../concepts/feature-tables.md) that contain [data sources](../concepts/sources.md). Feature tables are both a schema and a means of identifying data sources for features, and allow Feast to know how to interpret your data, and where to find it.
-
-After registering a feature table with Feast, users can trigger an ingestion from their data source into Feast. This loads feature values from an upstream data source into Feast stores through ingestion jobs.
-
-Visit [feature tables](../concepts/feature-tables.md#overview) to learn more about them.
-
-{% page-ref page="define-and-ingest-features.md" %}
-
-### Retrieving historical features for training
-
-In order to generate a training dataset it is necessary to provide both an [entity dataframe ](../concepts/glossary.md#entity-dataframe)and feature references through the[ Feast SDK](https://api.docs.feast.dev/python/) to retrieve historical features. For historical serving, Feast requires that you provide the entities and timestamps for the corresponding feature data. Feast produces a point-in-time correct dataset using the requested features. These features can be requested from an unlimited number of feature sets.
-
-{% page-ref page="getting-training-features.md" %}
-
-### Retrieving online features for online serving
-
-Online retrieval uses feature references through the [Feast Online Serving API](https://api.docs.feast.dev/grpc/feast.serving.pb.html) to retrieve online features. Online serving allows for very low latency requests to feature data at very high throughput.
-
-{% page-ref page="getting-online-features.md" %}
-
diff --git a/examples/java-demo/README.md b/examples/java-demo/README.md
new file mode 100644
index 0000000000..b908bb7625
--- /dev/null
+++ b/examples/java-demo/README.md
@@ -0,0 +1,162 @@
+
+# Running Feast Java Server with Redis & calling with python (with registry in GCP)
+
+For this tutorial, we setup Feast with Redis, using the Feast CLI to register and materialize features, and then retrieving via a Feast Java server deployed in Kubernetes via a gRPC call.
+> :point_right: for tips on how to run and debug this locally without using Kubernetes, see [java/serving/README.md](https://github.com/feast-dev/feast/blob/master/java/serving/README.md)
+
+## First, let's setup a Redis cluster
+1. Start minikube (`minikube start`)
+2. Use helm to install a default Redis cluster
+ ```bash
+ helm repo add bitnami https://charts.bitnami.com/bitnami
+ helm repo update
+ helm install my-redis bitnami/redis
+ ```
+ ![](redis-screenshot.png)
+3. Port forward Redis so we can materialize features to it
+
+ ```bash
+ kubectl port-forward --namespace default svc/my-redis-master 6379:6379
+ ```
+4. Get your Redis password using the command (pasted below for convenience). We'll need this to tell Feast how to communicate with the cluster.
+
+ ```bash
+ export REDIS_PASSWORD=$(kubectl get secret --namespace default my-redis -o jsonpath="{.data.redis-password}" | base64 --decode)
+ echo $REDIS_PASSWORD
+ ```
+
+## Next, we setup a local Feast repo
+1. Install Feast with Redis dependencies `pip install "feast[redis]"`
+2. Make a bucket in GCS (or S3)
+3. The feature repo is already setup here, so you just need to swap in your GCS bucket and Redis credentials.
+ We need to modify the `feature_store.yaml`, which has two fields for you to replace:
+ ```yaml
+ registry: gs://[YOUR BUCKET]/demo-repo/registry.db
+ project: feast_java_demo
+ provider: gcp
+ online_store:
+ type: redis
+ connection_string: localhost:6379,password=[YOUR PASSWORD]
+ offline_store:
+ type: file
+ flags:
+ alpha_features: true
+ on_demand_transforms: true
+ ```
+4. Run `feast apply` to apply your local features to the remote registry
+5. Materialize features to the online store:
+ ```bash
+ CURRENT_TIME=$(date -u +"%Y-%m-%dT%H:%M:%S")
+ feast materialize-incremental $CURRENT_TIME
+ ```
+
+## Now let's setup the Feast Server
+1. Add the gcp-auth addon to mount GCP credentials:
+ ```bash
+ minikube addons enable gcp-auth
+ ```
+3. Add Feast's Java feature server chart repo
+ ```bash
+ helm repo add feast-charts https://feast-helm-charts.storage.googleapis.com
+ helm repo update
+ ```
+4. Modify the application-override.yaml file to have your credentials + bucket location:
+ ```yaml
+ feature-server:
+ application-override.yaml:
+ enabled: true
+ feast:
+ activeStore: online
+ stores:
+ - name: online
+ type: REDIS
+ config:
+ host: my-redis-master
+ port: 6379
+ password: [YOUR PASSWORD]
+ global:
+ registry:
+ path: gs://[YOUR BUCKET]/demo-repo/registry.db
+ cache_ttl_seconds: 60
+ project: feast_java_demo
+ ```
+5. Install the Feast helm chart: `helm install feast-release feast-charts/feast --values application-override.yaml`
+6. (Optional): check logs of the server to make sure it’s working
+ ```bash
+ kubectl logs svc/feast-release-feature-server
+ ```
+7. Port forward to expose the grpc endpoint:
+ ```bash
+ kubectl port-forward svc/feast-release-feature-server 6566:6566
+ ```
+8. Make a gRPC call:
+ - Python example
+ ```bash
+ python test.py
+ ```
+ - gRPC cli:
+
+ ```bash
+ grpc_cli call localhost:6566 GetOnlineFeatures '
+ features {
+ val: "driver_hourly_stats:conv_rate"
+ val: "driver_hourly_stats:acc_rate"
+ }
+ entities {
+ key: "driver_id"
+ value {
+ val {
+ int64_val: 1001
+ }
+ val {
+ int64_val: 1002
+ }
+ }
+ }'
+ ```
+
+ - Response:
+
+ ```bash
+ connecting to localhost:6566
+ metadata {
+ feature_names {
+ val: "driver_hourly_stats:conv_rate"
+ val: "driver_hourly_stats:acc_rate"
+ }
+ }
+ results {
+ values {
+ float_val: 0.812357187
+ }
+ values {
+ float_val: 0.379484832
+ }
+ statuses: PRESENT
+ statuses: PRESENT
+ event_timestamps {
+ seconds: 1631725200
+ }
+ event_timestamps {
+ seconds: 1631725200
+ }
+ }
+ results {
+ values {
+ float_val: 0.840873241
+ }
+ values {
+ float_val: 0.151376978
+ }
+ statuses: PRESENT
+ statuses: PRESENT
+ event_timestamps {
+ seconds: 1631725200
+ }
+ event_timestamps {
+ seconds: 1631725200
+ }
+ }
+ Rpc succeeded with OK status
+
+ ```
\ No newline at end of file
diff --git a/examples/java-demo/feature_repo/__init__.py b/examples/java-demo/feature_repo/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/examples/java-demo/feature_repo/application-override.yaml b/examples/java-demo/feature_repo/application-override.yaml
new file mode 100644
index 0000000000..dbdeda4c04
--- /dev/null
+++ b/examples/java-demo/feature_repo/application-override.yaml
@@ -0,0 +1,17 @@
+feature-server:
+ application-override.yaml:
+ enabled: true
+ feast:
+ activeStore: online
+ stores:
+ - name: online
+ type: REDIS
+ config:
+ host: my-redis-master
+ port: 6379
+ password: [YOUR PASSWORD]
+global:
+ registry:
+ path: gs://[YOUR BUCKET]/demo-repo/registry.db
+ cache_ttl_seconds: 60
+ project: feast_java_demo
diff --git a/examples/java-demo/feature_repo/data/driver_stats_with_string.parquet b/examples/java-demo/feature_repo/data/driver_stats_with_string.parquet
new file mode 100644
index 0000000000..83b8c31aa5
Binary files /dev/null and b/examples/java-demo/feature_repo/data/driver_stats_with_string.parquet differ
diff --git a/examples/java-demo/feature_repo/driver_repo.py b/examples/java-demo/feature_repo/driver_repo.py
new file mode 100644
index 0000000000..233593ff02
--- /dev/null
+++ b/examples/java-demo/feature_repo/driver_repo.py
@@ -0,0 +1,61 @@
+import pandas as pd
+from feast import Entity, Feature, FeatureView, FileSource, ValueType
+from feast.data_source import RequestDataSource
+from feast.on_demand_feature_view import on_demand_feature_view
+from feast.request_feature_view import RequestFeatureView
+from google.protobuf.duration_pb2 import Duration
+
+driver_hourly_stats = FileSource(
+ path="data/driver_stats_with_string.parquet",
+ event_timestamp_column="event_timestamp",
+ created_timestamp_column="created",
+)
+driver = Entity(name="driver_id", value_type=ValueType.INT64, description="driver id",)
+driver_hourly_stats_view = FeatureView(
+ name="driver_hourly_stats",
+ entities=["driver_id"],
+ ttl=Duration(seconds=86400000),
+ features=[
+ Feature(name="conv_rate", dtype=ValueType.FLOAT),
+ Feature(name="acc_rate", dtype=ValueType.FLOAT),
+ Feature(name="avg_daily_trips", dtype=ValueType.INT64),
+ Feature(name="string_feature", dtype=ValueType.STRING),
+ ],
+ online=True,
+ batch_source=driver_hourly_stats,
+ tags={},
+)
+
+# Define a request data source which encodes features / information only
+# available at request time (e.g. part of the user initiated HTTP request)
+input_request = RequestDataSource(
+ name="vals_to_add",
+ schema={"val_to_add": ValueType.INT64, "val_to_add_2": ValueType.INT64},
+)
+
+# Define an on demand feature view which can generate new features based on
+# existing feature views and RequestDataSource features
+@on_demand_feature_view(
+ inputs={
+ "driver_hourly_stats": driver_hourly_stats_view,
+ "vals_to_add": input_request,
+ },
+ features=[
+ Feature(name="conv_rate_plus_val1", dtype=ValueType.DOUBLE),
+ Feature(name="conv_rate_plus_val2", dtype=ValueType.DOUBLE),
+ ],
+)
+def transformed_conv_rate(inputs: pd.DataFrame) -> pd.DataFrame:
+ df = pd.DataFrame()
+ df["conv_rate_plus_val1"] = inputs["conv_rate"] + inputs["val_to_add"]
+ df["conv_rate_plus_val2"] = inputs["conv_rate"] + inputs["val_to_add_2"]
+ return df
+
+
+# Define request feature view
+driver_age_request_fv = RequestFeatureView(
+ name="driver_age",
+ request_data_source=RequestDataSource(
+ name="driver_age", schema={"driver_age": ValueType.INT64,}
+ ),
+)
diff --git a/examples/java-demo/feature_repo/feature_store.yaml b/examples/java-demo/feature_repo/feature_store.yaml
new file mode 100644
index 0000000000..91c65b512a
--- /dev/null
+++ b/examples/java-demo/feature_repo/feature_store.yaml
@@ -0,0 +1,11 @@
+registry: gs://[YOUR BUCKET]/demo-repo/registry.db
+project: feast_java_demo
+provider: gcp
+online_store:
+ type: redis
+ connection_string: localhost:6379,password=[YOUR PASSWORD]
+offline_store:
+ type: file
+flags:
+ alpha_features: true
+ on_demand_transforms: true
diff --git a/examples/java-demo/feature_repo/test.py b/examples/java-demo/feature_repo/test.py
new file mode 100644
index 0000000000..f73883019d
--- /dev/null
+++ b/examples/java-demo/feature_repo/test.py
@@ -0,0 +1,28 @@
+import grpc
+from feast.protos.feast.serving.ServingService_pb2 import (
+ FeatureList,
+ GetOnlineFeaturesRequest,
+)
+from feast.protos.feast.serving.ServingService_pb2_grpc import ServingServiceStub
+from feast.protos.feast.types.Value_pb2 import RepeatedValue, Value
+
+
+# Sample logic to fetch from a local gRPC java server deployed at 6566
+def fetch_java():
+ channel = grpc.insecure_channel("localhost:6566")
+ stub = ServingServiceStub(channel)
+ feature_refs = FeatureList(val=["driver_hourly_stats:conv_rate"])
+ entity_rows = {
+ "driver_id": RepeatedValue(
+ val=[Value(int64_val=driver_id) for driver_id in range(1001, 1003)]
+ )
+ }
+
+ print(
+ stub.GetOnlineFeatures(
+ GetOnlineFeaturesRequest(features=feature_refs, entities=entity_rows,)
+ )
+ )
+
+if __name__ == "__main__":
+ fetch_java()
diff --git a/examples/java-demo/redis-screenshot.png b/examples/java-demo/redis-screenshot.png
new file mode 100644
index 0000000000..489deb699d
Binary files /dev/null and b/examples/java-demo/redis-screenshot.png differ
diff --git a/examples/quickstart/quickstart.ipynb b/examples/quickstart/quickstart.ipynb
index 3b148137ef..3679fcc778 100644
--- a/examples/quickstart/quickstart.ipynb
+++ b/examples/quickstart/quickstart.ipynb
@@ -27,12 +27,12 @@
"In this tutorial, we use feature stores to generate training data and power online model inference for a ride-sharing driver satisfaction prediction model. Feast addresses several common issues in this flow:\n",
"1. **Training-serving skew and complex data joins:** Feature values often exist across multiple tables. Joining these datasets can be complicated, slow, and error-prone.\n",
" - Feast joins these tables with battle-tested logic that ensures *point-in-time* correctness so future feature values do not leak to models.\n",
- " - **Upcoming*: Feast alerts users to offline / online skew with data quality monitoring. \n",
+ " - Feast alerts users to offline / online skew with data quality monitoring. \n",
"2. **Online feature availability:** At inference time, models often need access to features that aren't readily available and need to be precomputed from other datasources. \n",
" - Feast manages deployment to a variety of online stores (e.g. DynamoDB, Redis, Google Cloud Datastore) and ensures necessary features are consistently *available* and *freshly computed* at inference time.\n",
"3. **Feature reusability and model versioning:** Different teams within an organization are often unable to reuse features across projects, resulting in duplicate feature creation logic. Models have data dependencies that need to be versioned, for example when running A/B tests on model versions.\n",
" - Feast enables discovery of and collaboration on previously used features and enables versioning of sets of features (via *feature services*). \n",
- " - **Upcoming*: Feast enables feature transformation so users can re-use transformation logic across online / offline usecases and across models.\n",
+ " - Feast enables feature transformation so users can re-use transformation logic across online / offline usecases and across models.\n",
"\n",
"We will:\n",
"- Deploy a local feature store with a Parquet file offline store and Sqlite online store.\n",
@@ -188,11 +188,13 @@
"\n",
"Valid values for `provider` in `feature_store.yaml` are:\n",
"\n",
- "* local: use file source / SQLite\n",
- "* gcp: use BigQuery / Google Cloud Datastore\n",
- "* aws: use Redshift / DynamoDB\n",
+ "* local: use file source with SQLite/Redis\n",
+ "* gcp: use BigQuery/Snowflake with Google Cloud Datastore/Redis\n",
+ "* aws: use Redshift/Snowflake with DynamoDB/Redis\n",
"\n",
- "A custom setup (e.g. using the built-in support for Redis) can be made by following https://docs.feast.dev/v/master/how-to-guides/creating-a-custom-provider"
+ "Note that there are many other sources Feast works with, including Azure, Hive, Trino, and PostgreSQL via community plugins. See https://docs.feast.dev/getting-started/third-party-integrations for all supported datasources.",
+ "\n",
+ "A custom setup can also be made by following https://docs.feast.dev/v/master/how-to-guides/creating-a-custom-provider"
]
},
{
@@ -794,7 +796,7 @@
"\n",
"- Read the [Concepts](https://docs.feast.dev/getting-started/concepts/) page to understand the Feast data model and architecture.\n",
"- Check out our [Tutorials](https://docs.feast.dev/tutorials/tutorials-overview) section for more examples on how to use Feast.\n",
- "- Follow our [Running Feast with GCP/AWS](https://docs.feast.dev/how-to-guides/feast-gcp-aws) guide for a more in-depth tutorial on using Feast.\n",
+ "- Follow our [Running Feast with Snowflake/GCP/AWS](https://docs.feast.dev/how-to-guides/feast-snowflake-gcp-aws) guide for a more in-depth tutorial on using Feast.\n",
"- Join other Feast users and contributors in [Slack](https://slack.feast.dev/) and become part of the community!"
]
}
diff --git a/go.mod b/go.mod
index f4a1455056..109666b762 100644
--- a/go.mod
+++ b/go.mod
@@ -25,8 +25,8 @@ require (
go.opencensus.io v0.22.3 // indirect
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect
- golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d
- golang.org/x/tools v0.1.7 // indirect
+ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f
+ golang.org/x/tools v0.1.8 // indirect
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect
google.golang.org/grpc v1.29.1
google.golang.org/protobuf v1.27.1 // indirect
diff --git a/go.sum b/go.sum
index 5e87ccf6db..8b0c2677f3 100644
--- a/go.sum
+++ b/go.sum
@@ -345,6 +345,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
@@ -386,6 +387,7 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d h1:g9qWBGx4puODJTMVyoPrpoxPFgVGd+z1DZwjfRu4d0I=
@@ -415,6 +417,7 @@ golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -454,6 +457,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
@@ -464,6 +468,7 @@ golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/time v0.0.0-20161028155119-f51c12702a4d/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -525,6 +530,8 @@ golang.org/x/tools v0.0.0-20201124005743-911501bfb504 h1:jOKV2ysikH1GANB7t2Lotmh
golang.org/x/tools v0.0.0-20201124005743-911501bfb504/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ=
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
+golang.org/x/tools v0.1.8 h1:P1HhGGuLW4aAclzjtmJdf0mJOjVUZUzOTqkAkWL+l6w=
+golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
diff --git a/infra/charts/feast-python-server/Chart.yaml b/infra/charts/feast-python-server/Chart.yaml
index fc20d180bc..c71d0ae78b 100644
--- a/infra/charts/feast-python-server/Chart.yaml
+++ b/infra/charts/feast-python-server/Chart.yaml
@@ -2,7 +2,7 @@ apiVersion: v2
name: feast-python-server
description: Feast Feature Server in Python
type: application
-version: 0.1.0
+version: 0.18.1
keywords:
- machine learning
- big data
diff --git a/infra/charts/feast-python-server/README.md b/infra/charts/feast-python-server/README.md
index b8516bc6dc..6639046f2c 100644
--- a/infra/charts/feast-python-server/README.md
+++ b/infra/charts/feast-python-server/README.md
@@ -1,6 +1,6 @@
# feast-python-server
-![Version: 0.1.0](https://img.shields.io/badge/Version-0.1.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square)
+![Version: 0.18.1](https://img.shields.io/badge/Version-0.1.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square)
Feast Feature Server in Python
@@ -56,16 +56,4 @@ RUN pip install pip --upgrade
RUN pip install feast
COPY feature_store.yaml /feature_store.yaml
-```
-
-Make sure that you have enabled the flags for the python server. Example `feature_store.yaml`:
-```
-project: feature_repo
-registry: data/registry.db
-provider: local
-online_store:
- path: data/online_store.db
-flags:
- alpha_features: true
- python_feature_server: true
```
\ No newline at end of file
diff --git a/infra/charts/feast/Chart.yaml b/infra/charts/feast/Chart.yaml
index 4dd16aa906..b8cc79e241 100644
--- a/infra/charts/feast/Chart.yaml
+++ b/infra/charts/feast/Chart.yaml
@@ -1,7 +1,7 @@
apiVersion: v1
description: Feature store for machine learning
name: feast
-version: 0.101.0
+version: 0.18.1
keywords:
- machine learning
- big data
diff --git a/infra/charts/feast/README.md b/infra/charts/feast/README.md
index b8411cc9f7..bcde076865 100644
--- a/infra/charts/feast/README.md
+++ b/infra/charts/feast/README.md
@@ -10,7 +10,7 @@ This repo contains Helm charts for Feast components that are being installed on
## Chart: Feast
-Feature store for machine learning Current chart version is `0.101.0`
+Feature store for machine learning Current chart version is `0.18.1`
## Installation
@@ -56,9 +56,9 @@ For more details, please see: https://docs.feast.dev/how-to-guides/running-feast
| Repository | Name | Version |
|------------|------|---------|
-| https://charts.helm.sh/stable | redis | 10.5.6 |
-| https://feast-helm-charts.storage.googleapis.com | feature-server(feature-server) | 0.101.0 |
-| https://feast-helm-charts.storage.googleapis.com | transformation-service(transformation-service) | 0.101.0 |
+| https://charts.helm.sh/stable | redis | 10.5.6 |
+| https://feast-helm-charts.storage.googleapis.com | feature-server(feature-server) | 0.18.1 |
+| https://feast-helm-charts.storage.googleapis.com | transformation-service(transformation-service) | 0.18.1 |
## Values
diff --git a/infra/charts/feast/charts/feature-server/Chart.yaml b/infra/charts/feast/charts/feature-server/Chart.yaml
index f0336cee2f..2c0155919e 100644
--- a/infra/charts/feast/charts/feature-server/Chart.yaml
+++ b/infra/charts/feast/charts/feature-server/Chart.yaml
@@ -1,8 +1,8 @@
apiVersion: v1
description: "Feast Feature Server: Online feature serving service for Feast"
name: feature-server
-version: 0.100.4
-appVersion: v0.15.0
+version: 0.18.1
+appVersion: v0.18.1
keywords:
- machine learning
- big data
diff --git a/infra/charts/feast/charts/feature-server/README.md b/infra/charts/feast/charts/feature-server/README.md
index 773f03af5e..7ce4e67822 100644
--- a/infra/charts/feast/charts/feature-server/README.md
+++ b/infra/charts/feast/charts/feature-server/README.md
@@ -1,6 +1,6 @@
# feature-server
-![Version: 0.100.4](https://img.shields.io/badge/Version-0.100.4-informational?style=flat-square) ![AppVersion: v0.15.0](https://img.shields.io/badge/AppVersion-v0.15.0-informational?style=flat-square)
+![Version: 0.18.1](https://img.shields.io/badge/Version-0.18.1-informational?style=flat-square) ![AppVersion: v0.18.1](https://img.shields.io/badge/AppVersion-v0.18.1-informational?style=flat-square)
Feast Feature Server: Online feature serving service for Feast
@@ -8,62 +8,63 @@ Feast Feature Server: Online feature serving service for Feast
## Values
-| Key | Type | Default | Description |
-|-----|------|---------|-------------|
-| "application-generated.yaml".enabled | bool | `true` | Flag to include Helm generated configuration. Please set `application-override.yaml` to override this configuration. |
-| "application-override.yaml" | object | `{"enabled":true}` | Configuration to override the default [application.yaml](https://github.com/feast-dev/feast/blob/master/java/serving/src/main/resources/application.yml). Will be created as a ConfigMap. `application-override.yaml` has a higher precedence than `application-secret.yaml` |
-| "application-secret.yaml" | object | `{"enabled":true}` | Configuration to override the default [application.yaml](https://github.com/feast-dev/feast/blob/master/java/serving/src/main/resources/application.yml). Will be created as a Secret. `application-override.yaml` has a higher precedence than `application-secret.yaml`. It is recommended to either set `application-override.yaml` or `application-secret.yaml` only to simplify config management. |
-| "application.yaml".enabled | bool | `true` | Flag to include the default [configuration](https://github.com/feast-dev/feast/blob/master/java/serving/src/main/resources/application.yml). Please set `application-override.yaml` to override this configuration. |
-| envOverrides | object | `{}` | Extra environment variables to set |
-| image.pullPolicy | string | `"IfNotPresent"` | Image pull policy |
-| image.repository | string | `"feastdev/feature-server-java"` | Docker image for Feature Server repository |
-| image.tag | string | `"0.17.0"` | Image tag |
-| ingress.grpc.annotations | object | `{}` | Extra annotations for the ingress |
-| ingress.grpc.auth.enabled | bool | `false` | Flag to enable auth |
-| ingress.grpc.class | string | `"nginx"` | Which ingress controller to use |
-| ingress.grpc.enabled | bool | `false` | Flag to create an ingress resource for the service |
-| ingress.grpc.hosts | list | `[]` | List of hostnames to match when routing requests |
-| ingress.grpc.https.enabled | bool | `true` | Flag to enable HTTPS |
-| ingress.grpc.https.secretNames | object | `{}` | Map of hostname to TLS secret name |
-| ingress.grpc.whitelist | string | `""` | Allowed client IP source ranges |
-| ingress.http.annotations | object | `{}` | Extra annotations for the ingress |
+| Key | Type | Default | Description |
+|-----|------|-------------------------------------------------------|-------------|
+| "application-generated.yaml".enabled | bool | `true` | Flag to include Helm generated configuration. Please set `application-override.yaml` to override this configuration. |
+| "application-override.yaml" | object | `{"enabled":true}` | Configuration to override the default [application.yaml](https://github.com/feast-dev/feast/blob/master/java/serving/src/main/resources/application.yml). Will be created as a ConfigMap. `application-override.yaml` has a higher precedence than `application-secret.yaml` |
+| "application-secret.yaml" | object | `{"enabled":true}` | Configuration to override the default [application.yaml](https://github.com/feast-dev/feast/blob/master/java/serving/src/main/resources/application.yml). Will be created as a Secret. `application-override.yaml` has a higher precedence than `application-secret.yaml`. It is recommended to either set `application-override.yaml` or `application-secret.yaml` only to simplify config management. |
+| "application.yaml".enabled | bool | `true` | Flag to include the default [configuration](https://github.com/feast-dev/feast/blob/master/java/serving/src/main/resources/application.yml). Please set `application-override.yaml` to override this configuration. |
+| envOverrides | object | `{}` | Extra environment variables to set |
+| image.pullPolicy | string | `"IfNotPresent"` | Image pull policy |
+| image.repository | string | `"feastdev/feature-server-java"` | Docker image for Feature Server repository |
+| image.tag | string | `"0.18.1"` | Image tag |
+| ingress.grpc.annotations | object | `{}` | Extra annotations for the ingress |
+| ingress.grpc.auth.enabled | bool | `false` | Flag to enable auth |
+| ingress.grpc.class | string | `"nginx"` | Which ingress controller to use |
+| ingress.grpc.enabled | bool | `false` | Flag to create an ingress resource for the service |
+| ingress.grpc.hosts | list | `[]` | List of hostnames to match when routing requests |
+| ingress.grpc.https.enabled | bool | `true` | Flag to enable HTTPS |
+| ingress.grpc.https.secretNames | object | `{}` | Map of hostname to TLS secret name |
+| ingress.grpc.whitelist | string | `""` | Allowed client IP source ranges |
+| ingress.http.annotations | object | `{}` | Extra annotations for the ingress |
| ingress.http.auth.authUrl | string | `"http://auth-server.auth-ns.svc.cluster.local/auth"` | URL to an existing authentication service |
-| ingress.http.auth.enabled | bool | `false` | Flag to enable auth |
-| ingress.http.class | string | `"nginx"` | Which ingress controller to use |
-| ingress.http.enabled | bool | `false` | Flag to create an ingress resource for the service |
-| ingress.http.hosts | list | `[]` | List of hostnames to match when routing requests |
-| ingress.http.https.enabled | bool | `true` | Flag to enable HTTPS |
-| ingress.http.https.secretNames | object | `{}` | Map of hostname to TLS secret name |
-| ingress.http.whitelist | string | `""` | Allowed client IP source ranges |
-| javaOpts | string | `nil` | [JVM options](https://docs.oracle.com/cd/E22289_01/html/821-1274/configuring-the-default-jvm-and-java-arguments.html). For better performance, it is advised to set the min and max heap: `-Xms2048m -Xmx2048m` |
-| livenessProbe.enabled | bool | `true` | Flag to enabled the probe |
-| livenessProbe.failureThreshold | int | `5` | Min consecutive failures for the probe to be considered failed |
-| livenessProbe.initialDelaySeconds | int | `60` | Delay before the probe is initiated |
-| livenessProbe.periodSeconds | int | `10` | How often to perform the probe |
-| livenessProbe.successThreshold | int | `1` | Min consecutive success for the probe to be considered successful |
-| livenessProbe.timeoutSeconds | int | `5` | When the probe times out |
-| logLevel | string | `"WARN"` | Default log level, use either one of `DEBUG`, `INFO`, `WARN` or `ERROR` |
-| logType | string | `"Console"` | Log format, either `JSON` or `Console` |
-| nodeSelector | object | `{}` | Node labels for pod assignment |
-| podLabels | object | `{}` | Labels to be added to Feast Serving pods |
-| readinessProbe.enabled | bool | `true` | Flag to enabled the probe |
-| readinessProbe.failureThreshold | int | `5` | Min consecutive failures for the probe to be considered failed |
-| readinessProbe.initialDelaySeconds | int | `15` | Delay before the probe is initiated |
-| readinessProbe.periodSeconds | int | `10` | How often to perform the probe |
-| readinessProbe.successThreshold | int | `1` | Min consecutive success for the probe to be considered successful |
-| readinessProbe.timeoutSeconds | int | `10` | When the probe times out |
-| replicaCount | int | `1` | Number of pods that will be created |
-| resources | object | `{}` | CPU/memory [resource requests/limit](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#resource-requests-and-limits-of-pod-and-container) |
-| secrets | list | `[]` | List of Kubernetes secrets to be mounted. These secrets will be mounted on /etc/secrets/. |
-| service.grpc.nodePort | string | `nil` | Port number that each cluster node will listen to |
-| service.grpc.port | int | `6566` | Service port for GRPC requests |
-| service.grpc.targetPort | int | `6566` | Container port serving GRPC requests |
-| service.http.nodePort | string | `nil` | Port number that each cluster node will listen to |
-| service.http.port | int | `80` | Service port for HTTP requests |
-| service.http.targetPort | int | `8080` | Container port serving HTTP requests and Prometheus metrics |
-| service.type | string | `"ClusterIP"` | Kubernetes service type |
-| transformationService.host | string | `""` | |
-| transformationService.port | int | `6566` | |
+| ingress.http.auth.enabled | bool | `false` | Flag to enable auth |
+| ingress.http.class | string | `"nginx"` | Which ingress controller to use |
+| ingress.http.enabled | bool | `false` | Flag to create an ingress resource for the service |
+| ingress.http.hosts | list | `[]` | List of hostnames to match when routing requests |
+| ingress.http.https.enabled | bool | `true` | Flag to enable HTTPS |
+| ingress.http.https.secretNames | object | `{}` | Map of hostname to TLS secret name |
+| ingress.http.whitelist | string | `""` | Allowed client IP source ranges |
+| javaOpts | string | `nil` | [JVM options](https://docs.oracle.com/cd/E22289_01/html/821-1274/configuring-the-default-jvm-and-java-arguments.html). For better performance, it is advised to set the min and max heap: `-Xms2048m -Xmx2048m` |
+| livenessProbe.enabled | bool | `true` | Flag to enabled the probe |
+| livenessProbe.failureThreshold | int | `5` | Min consecutive failures for the probe to be considered failed |
+| livenessProbe.initialDelaySeconds | int | `60` | Delay before the probe is initiated |
+| livenessProbe.periodSeconds | int | `10` | How often to perform the probe |
+| livenessProbe.successThreshold | int | `1` | Min consecutive success for the probe to be considered successful |
+| livenessProbe.timeoutSeconds | int | `5` | When the probe times out |
+| logLevel | string | `"WARN"` | Default log level, use either one of `DEBUG`, `INFO`, `WARN` or `ERROR` |
+| logType | string | `"Console"` | Log format, either `JSON` or `Console` |
+| nodeSelector | object | `{}` | Node labels for pod assignment |
+| podAnnotations | object | `{}` | Annotations to be added to Feast Serving pods |
+| podLabels | object | `{}` | Labels to be added to Feast Serving pods |
+| readinessProbe.enabled | bool | `true` | Flag to enabled the probe |
+| readinessProbe.failureThreshold | int | `5` | Min consecutive failures for the probe to be considered failed |
+| readinessProbe.initialDelaySeconds | int | `15` | Delay before the probe is initiated |
+| readinessProbe.periodSeconds | int | `10` | How often to perform the probe |
+| readinessProbe.successThreshold | int | `1` | Min consecutive success for the probe to be considered successful |
+| readinessProbe.timeoutSeconds | int | `10` | When the probe times out |
+| replicaCount | int | `1` | Number of pods that will be created |
+| resources | object | `{}` | CPU/memory [resource requests/limit](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#resource-requests-and-limits-of-pod-and-container) |
+| secrets | list | `[]` | List of Kubernetes secrets to be mounted. These secrets will be mounted on /etc/secrets/. |
+| service.grpc.nodePort | string | `nil` | Port number that each cluster node will listen to |
+| service.grpc.port | int | `6566` | Service port for GRPC requests |
+| service.grpc.targetPort | int | `6566` | Container port serving GRPC requests |
+| service.http.nodePort | string | `nil` | Port number that each cluster node will listen to |
+| service.http.port | int | `80` | Service port for HTTP requests |
+| service.http.targetPort | int | `8080` | Container port serving HTTP requests and Prometheus metrics |
+| service.type | string | `"ClusterIP"` | Kubernetes service type |
+| transformationService.host | string | `""` | |
+| transformationService.port | int | `6566` | |
----------------------------------------------
Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
diff --git a/infra/charts/feast/charts/feature-server/templates/configmap.yaml b/infra/charts/feast/charts/feature-server/templates/configmap.yaml
index c4bdd5a664..fbf2633e8e 100644
--- a/infra/charts/feast/charts/feature-server/templates/configmap.yaml
+++ b/infra/charts/feast/charts/feature-server/templates/configmap.yaml
@@ -14,26 +14,40 @@ data:
{{- if index .Values "application-generated.yaml" "enabled" }}
feast:
registry: {{ .Values.global.registry.path }}
- registry-refresh-interval: {{ .Values.global.registry.cache_ttl_seconds }}
+ registryRefreshInterval: {{ .Values.global.registry.cache_ttl_seconds }}
{{- if .Values.transformationService.host }}
- transformation-service-endpoint: {{ .Values.transformationService.host}}:{{ .Values.transformationService.port }}
+ transformationServiceEndpoint: {{ .Values.transformationService.host}}:{{ .Values.transformationService.port }}
{{- else }}
- transformation-service-endpoint: {{ .Release.Name }}-transformation-service:{{ .Values.transformationService.port }}
+ transformationServiceEndpoint: {{ .Release.Name }}-transformation-service:{{ .Values.transformationService.port }}
{{- end }}
- active_store: online
+ activeStore: online
stores:
- name: online
type: REDIS
config:
host: {{ .Release.Name }}-redis-master
port: 6379
-
- server:
- port: {{ .Values.service.http.targetPort }}
+ rest:
+ server:
+ port: {{ .Values.service.http.targetPort }}
+ grpc:
+ server:
+ port: {{ .Values.service.grpc.targetPort }}
{{- end }}
application-override.yaml: |
{{- if index .Values "application-override.yaml" "enabled" }}
-{{- toYaml (index .Values "application-override.yaml") | nindent 4 }}
+ {{- if index .Values "application-override.yaml" "feast" }}
+ feast: {{- toYaml (index .Values "application-override.yaml" "feast") | nindent 6 }}
+ registry: {{ .Values.global.registry.path }}
+ registryRefreshInterval: {{ .Values.global.registry.cache_ttl_seconds }}
+ project: {{ .Values.global.project }}
+ {{- end }}
+ {{- if index .Values "application-override.yaml" "rest" }}
+ rest: {{- toYaml (index .Values "application-override.yaml" "rest") | nindent 6 }}
+ {{- end }}
+ {{- if index .Values "application-override.yaml" "grpc" }}
+ grpc: {{- toYaml (index .Values "application-override.yaml" "grpc") | nindent 6 }}
+ {{- end }}
{{- end }}
diff --git a/infra/charts/feast/charts/feature-server/templates/deployment.yaml b/infra/charts/feast/charts/feature-server/templates/deployment.yaml
index ad0529978d..1d1bc40029 100644
--- a/infra/charts/feast/charts/feature-server/templates/deployment.yaml
+++ b/infra/charts/feast/charts/feature-server/templates/deployment.yaml
@@ -21,6 +21,9 @@ spec:
annotations:
checksum/configmap: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
checksum/secret: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
+ {{- if .Values.podAnnotations }}
+ {{ toYaml .Values.podAnnotations | nindent 8 }}
+ {{- end }}
labels:
app: {{ template "feature-server.name" . }}
component: serving
@@ -89,7 +92,7 @@ spec:
- java
- -jar
- /opt/feast/feast-serving.jar
- - {{- if index .Values "application.yaml" "enabled" -}}
+ - {{ if index .Values "application.yaml" "enabled" -}}
classpath:/application.yml
{{- end }}
{{- if index .Values "application-generated.yaml" "enabled" -}}
diff --git a/infra/charts/feast/charts/feature-server/templates/secret.yaml b/infra/charts/feast/charts/feature-server/templates/secret.yaml
index d821f8e6f1..b6aa88c258 100644
--- a/infra/charts/feast/charts/feature-server/templates/secret.yaml
+++ b/infra/charts/feast/charts/feature-server/templates/secret.yaml
@@ -12,4 +12,12 @@ metadata:
type: Opaque
stringData:
application-secret.yaml: |
-{{- toYaml (index .Values "application-secret.yaml") | nindent 4 }}
+ {{- if index .Values "application-secret.yaml" "feast" }}
+ feast: {{- toYaml (index .Values "application-secret.yaml" "feast") | nindent 6 }}
+ {{- end }}
+ {{- if index .Values "application-secret.yaml" "rest" }}
+ rest: {{- toYaml (index .Values "application-secret.yaml" "rest") | nindent 6 }}
+ {{- end }}
+ {{- if index .Values "application-secret.yaml" "grpc" }}
+ grpc: {{- toYaml (index .Values "application-secret.yaml" "grpc") | nindent 6 }}
+ {{- end }}
diff --git a/infra/charts/feast/charts/feature-server/values.yaml b/infra/charts/feast/charts/feature-server/values.yaml
index 92de49763c..c3fc43cef8 100644
--- a/infra/charts/feast/charts/feature-server/values.yaml
+++ b/infra/charts/feast/charts/feature-server/values.yaml
@@ -5,7 +5,7 @@ image:
# image.repository -- Docker image for Feature Server repository
repository: feastdev/feature-server-java
# image.tag -- Image tag
- tag: 0.17.0
+ tag: 0.18.1
# image.pullPolicy -- Image pull policy
pullPolicy: IfNotPresent
@@ -25,7 +25,7 @@ application-generated.yaml:
# "application-secret.yaml" -- Configuration to override the default [application.yaml](https://github.com/feast-dev/feast/blob/master/java/serving/src/main/resources/application.yml). Will be created as a Secret. `application-override.yaml` has a higher precedence than `application-secret.yaml`. It is recommended to either set `application-override.yaml` or `application-secret.yaml` only to simplify config management.
application-secret.yaml:
- enabled: true
+ enabled: false
# "application-override.yaml" -- Configuration to override the default [application.yaml](https://github.com/feast-dev/feast/blob/master/java/serving/src/main/resources/application.yml). Will be created as a ConfigMap. `application-override.yaml` has a higher precedence than `application-secret.yaml`
application-override.yaml:
@@ -140,5 +140,8 @@ envOverrides: {}
# secrets -- List of Kubernetes secrets to be mounted. These secrets will be mounted on /etc/secrets/.
secrets: []
+# podAnnotations -- Annotations to be added to Feast Serving pods
+podAnnotations: {}
+
# podLabels -- Labels to be added to Feast Serving pods
podLabels: {}
diff --git a/infra/charts/feast/charts/transformation-service/Chart.yaml b/infra/charts/feast/charts/transformation-service/Chart.yaml
index 2760aa93fd..434850ca8b 100644
--- a/infra/charts/feast/charts/transformation-service/Chart.yaml
+++ b/infra/charts/feast/charts/transformation-service/Chart.yaml
@@ -1,8 +1,8 @@
apiVersion: v1
description: "Transformation service: to compute on-demand features"
name: transformation-service
-version: 0.100.4
-appVersion: v0.15.0
+version: 0.18.1
+appVersion: v0.18.1
keywords:
- machine learning
- big data
diff --git a/infra/charts/feast/charts/transformation-service/README.md b/infra/charts/feast/charts/transformation-service/README.md
index 8089c1572b..20b39443d6 100644
--- a/infra/charts/feast/charts/transformation-service/README.md
+++ b/infra/charts/feast/charts/transformation-service/README.md
@@ -1,6 +1,6 @@
# transformation-service
-![Version: 0.100.4](https://img.shields.io/badge/Version-0.100.4-informational?style=flat-square) ![AppVersion: v0.15.0](https://img.shields.io/badge/AppVersion-v0.15.0-informational?style=flat-square)
+![Version: 0.18.1](https://img.shields.io/badge/Version-0.18.1-informational?style=flat-square) ![AppVersion: v0.18.1](https://img.shields.io/badge/AppVersion-v0.18.1-informational?style=flat-square)
Transformation service: to compute on-demand features
@@ -8,20 +8,20 @@ Transformation service: to compute on-demand features
## Values
-| Key | Type | Default | Description |
-|-----|------|---------|-------------|
-| envOverrides | object | `{}` | Extra environment variables to set |
-| image.pullPolicy | string | `"IfNotPresent"` | Image pull policy |
+| Key | Type | Default | Description |
+|-----|------|--------------------------------------------|-------------|
+| envOverrides | object | `{}` | Extra environment variables to set |
+| image.pullPolicy | string | `"IfNotPresent"` | Image pull policy |
| image.repository | string | `"feastdev/feature-transformation-server"` | Docker image for Transformation Server repository |
-| image.tag | string | `"0.17.0"` | Image tag |
-| nodeSelector | object | `{}` | Node labels for pod assignment |
-| podLabels | object | `{}` | Labels to be added to Feast Serving pods |
-| replicaCount | int | `1` | Number of pods that will be created |
-| resources | object | `{}` | CPU/memory [resource requests/limit](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#resource-requests-and-limits-of-pod-and-container) |
-| service.grpc.nodePort | string | `nil` | Port number that each cluster node will listen to |
-| service.grpc.port | int | `6566` | Service port for GRPC requests |
-| service.grpc.targetPort | int | `6566` | Container port serving GRPC requests |
-| service.type | string | `"ClusterIP"` | Kubernetes service type |
+| image.tag | string | `"0.18.1"` | Image tag |
+| nodeSelector | object | `{}` | Node labels for pod assignment |
+| podLabels | object | `{}` | Labels to be added to Feast Serving pods |
+| replicaCount | int | `1` | Number of pods that will be created |
+| resources | object | `{}` | CPU/memory [resource requests/limit](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#resource-requests-and-limits-of-pod-and-container) |
+| service.grpc.nodePort | string | `nil` | Port number that each cluster node will listen to |
+| service.grpc.port | int | `6566` | Service port for GRPC requests |
+| service.grpc.targetPort | int | `6566` | Container port serving GRPC requests |
+| service.type | string | `"ClusterIP"` | Kubernetes service type |
----------------------------------------------
Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
diff --git a/infra/charts/feast/charts/transformation-service/config/feature_store.yaml b/infra/charts/feast/charts/transformation-service/config/feature_store.yaml
index 234471fb96..555e93a306 100644
--- a/infra/charts/feast/charts/transformation-service/config/feature_store.yaml
+++ b/infra/charts/feast/charts/transformation-service/config/feature_store.yaml
@@ -5,5 +5,4 @@ provider: local
project: {{ .Values.global.project }}
flags:
on_demand_transforms: true
- python_feature_server: true
alpha_features: true
\ No newline at end of file
diff --git a/infra/charts/feast/charts/transformation-service/values.yaml b/infra/charts/feast/charts/transformation-service/values.yaml
index 7babb5f6b6..9c22dafdee 100644
--- a/infra/charts/feast/charts/transformation-service/values.yaml
+++ b/infra/charts/feast/charts/transformation-service/values.yaml
@@ -5,7 +5,7 @@ image:
# image.repository -- Docker image for Transformation Server repository
repository: feastdev/feature-transformation-server
# image.tag -- Image tag
- tag: 0.17.0
+ tag: 0.18.1
# image.pullPolicy -- Image pull policy
pullPolicy: IfNotPresent
diff --git a/infra/charts/feast/requirements.yaml b/infra/charts/feast/requirements.yaml
index a1ccdde0f3..96f78a6ee6 100644
--- a/infra/charts/feast/requirements.yaml
+++ b/infra/charts/feast/requirements.yaml
@@ -1,12 +1,12 @@
dependencies:
- name: feature-server
alias: feature-server
- version: 0.101.0
+ version: 0.18.1
condition: feature-server.enabled
repository: https://feast-helm-charts.storage.googleapis.com
- name: transformation-service
alias: transformation-service
- version: 0.101.0
+ version: 0.18.1
condition: transformation-service.enabled
repository: https://feast-helm-charts.storage.googleapis.com
- name: redis
diff --git a/infra/scripts/create-cluster.sh b/infra/scripts/create-cluster.sh
new file mode 100755
index 0000000000..24b961b977
--- /dev/null
+++ b/infra/scripts/create-cluster.sh
@@ -0,0 +1,98 @@
+#!/usr/bin/env bash
+# Settings
+# Make sure you run "brew install redis"
+
+# BIN_PATH="/opt/homebrew/bin"
+REDIS_CLI=`which redis-cli`
+REDIS_SERVER=`which redis-server`
+CLUSTER_HOST=127.0.0.1
+# Creates a cluster at ports 6001-6006 with 3 masters 6001-6003 and 3 slaves 6004-6006
+PORT=${2:-6000}
+TIMEOUT=2000
+NODES=6
+REPLICAS=1
+PROTECTED_MODE=yes
+ADDITIONAL_OPTIONS=""
+
+if [ -a config.sh ]
+then
+ source "config.sh"
+fi
+
+# Computed vars
+ENDPORT=$((PORT+NODES))
+
+if [ "$1" == "start" ]
+then
+ while [ $((PORT < ENDPORT)) != "0" ]; do
+ PORT=$((PORT+1))
+ echo "Starting $PORT"
+ $REDIS_SERVER --port $PORT --protected-mode $PROTECTED_MODE --cluster-enabled yes --cluster-config-file nodes-${PORT}.conf --cluster-node-timeout $TIMEOUT --appendonly yes --appendfilename appendonly-${PORT}.aof --dbfilename dump-${PORT}.rdb --logfile ${PORT}.log --daemonize yes ${ADDITIONAL_OPTIONS}
+ done
+ exit 0
+fi
+
+if [ "$1" == "create" ]
+then
+ HOSTS=""
+ while [ $((PORT < ENDPORT)) != "0" ]; do
+ PORT=$((PORT+1))
+ HOSTS="$HOSTS $CLUSTER_HOST:$PORT"
+ done
+ OPT_ARG=""
+ if [ "$2" == "-f" ]; then
+ OPT_ARG="--cluster-yes"
+ fi
+ $REDIS_CLI --cluster create $HOSTS --cluster-replicas $REPLICAS $OPT_ARG
+ exit 0
+fi
+
+if [ "$1" == "stop" ]
+then
+ while [ $((PORT < ENDPORT)) != "0" ]; do
+ PORT=$((PORT+1))
+ echo "Stopping $PORT"
+ $REDIS_CLI -p $PORT shutdown nosave
+ done
+ exit 0
+fi
+
+if [ "$1" == "watch" ]
+then
+ PORT=$((PORT+1))
+ while [ 1 ]; do
+ clear
+ date
+ $REDIS_CLI -p $PORT cluster nodes | head -30
+ sleep 1
+ done
+ exit 0
+fi
+
+if [ "$1" == "clean" ]
+then
+ echo "Cleaning *.log"
+ rm -rf *.log
+ echo "Cleaning appendonly-*"
+ rm -rf appendonly-*
+ echo "Cleaning dump-*.rdb"
+ rm -rf dump-*.rdb
+ echo "Cleaning nodes-*.conf"
+ rm -rf nodes-*.conf
+ exit 0
+fi
+
+if [ "$1" == "clean-logs" ]
+then
+ echo "Cleaning *.log"
+ rm -rf *.log
+ exit 0
+fi
+
+echo "Usage: $0 [start|create|stop|watch|clean|clean-logs|call]"
+echo "start [PORT] -- Launch Redis Cluster instances."
+echo "create [PORT] [-f] -- Create a cluster using redis-cli --cluster create."
+echo "stop [PORT] -- Stop Redis Cluster instances."
+echo "watch [PORT] -- Show CLUSTER NODES output (first 30 lines) of first node."
+echo "clean -- Remove all instances data, logs, configs."
+echo "clean-logs -- Remove just instances logs."
diff --git a/infra/scripts/helm/install-helm.sh b/infra/scripts/helm/install-helm.sh
index 3686f9dfdb..a5073289df 100755
--- a/infra/scripts/helm/install-helm.sh
+++ b/infra/scripts/helm/install-helm.sh
@@ -6,5 +6,4 @@ readonly STABLE_REPO_URL=https://charts.helm.sh/stable
readonly INCUBATOR_REPO_URL=https://charts.helm.sh/incubator
curl -s "https://get.helm.sh/helm-${HELM_VERSION}-linux-amd64.tar.gz" | tar -C /tmp -xz
sudo mv /tmp/linux-amd64/helm /usr/bin/helm
-helm init --client-only
-helm repo add incubator "$INCUBATOR_REPO_URL"
\ No newline at end of file
+helm repo add incubator "$INCUBATOR_REPO_URL"
diff --git a/infra/scripts/helm/push-helm-charts.sh b/infra/scripts/helm/push-helm-charts.sh
index 74961b196a..08753adb3c 100755
--- a/infra/scripts/helm/push-helm-charts.sh
+++ b/infra/scripts/helm/push-helm-charts.sh
@@ -10,13 +10,14 @@ fi
bucket=gs://feast-helm-charts
repo_url=https://feast-helm-charts.storage.googleapis.com/
-helm plugin install https://github.com/hayorov/helm-gcs.git --version 0.2.2 || true
+helm plugin install https://github.com/hayorov/helm-gcs.git --version 0.3.18 || true
helm repo add feast-helm-chart-repo $bucket
-mkdir -p feast
-cp -R * feast/ || true
-
+cd infra/charts
helm package feast
+helm package feast-python-server
-helm gcs push --public feast-${1}.tgz feast-helm-chart-repo --force
\ No newline at end of file
+helm gcs push --public feast-${1}.tgz feast-helm-chart-repo --force
+helm gcs push --public feast-python-server-${1}.tgz feast-helm-chart-repo --force
+rm -f ./*.tgz
\ No newline at end of file
diff --git a/infra/scripts/helm/validate-helm-chart-versions.sh b/infra/scripts/helm/validate-helm-chart-versions.sh
index 8d0b2941f5..8a6b464cbb 100755
--- a/infra/scripts/helm/validate-helm-chart-versions.sh
+++ b/infra/scripts/helm/validate-helm-chart-versions.sh
@@ -3,7 +3,7 @@
set -e
# Amount of file locations that need to be bumped in unison when versions increment
-UNIQUE_VERSIONS_COUNT=4
+UNIQUE_VERSIONS_COUNT=18
if [ $# -ne 1 ]; then
echo "Please provide a single semver version (without a \"v\" prefix) to test the repository against, e.g 0.99.0"
diff --git a/infra/scripts/publish-java-sdk.sh b/infra/scripts/publish-java-sdk.sh
index ed00799e84..68174db17a 100755
--- a/infra/scripts/publish-java-sdk.sh
+++ b/infra/scripts/publish-java-sdk.sh
@@ -69,4 +69,4 @@ gpg --import --batch --yes $GPG_KEY_IMPORT_DIR/private-key
echo "============================================================"
echo "Deploying Java SDK with revision: $REVISION"
echo "============================================================"
-mvn -f java/pom.xml --projects datatypes/java,sdk/java -Drevision=$REVISION --batch-mode clean deploy
+mvn -f java/pom.xml --projects .,datatypes,sdk -Drevision=$REVISION --batch-mode clean deploy
diff --git a/infra/templates/README.md.jinja2 b/infra/templates/README.md.jinja2
index a9277bb070..7d08c0d36f 100644
--- a/infra/templates/README.md.jinja2
+++ b/infra/templates/README.md.jinja2
@@ -21,9 +21,9 @@ Feast is an open source feature store for machine learning. Feast is the fastest
Please see our [documentation](https://docs.feast.dev/) for more information about the project.
## 📐 Architecture
-
+![](docs/assets/feast-marchitecture.png)
-The above architecture is the minimal Feast deployment. Want to run the full Feast on GCP/AWS? Click [here](https://docs.feast.dev/how-to-guides/feast-gcp-aws).
+The above architecture is the minimal Feast deployment. Want to run the full Feast on Snowflake/GCP/AWS? Click [here](https://docs.feast.dev/how-to-guides/feast-snowflake-gcp-aws).
## 🐣 Getting Started
@@ -133,7 +133,7 @@ pprint(feature_vector)
Please refer to the official documentation at [Documentation](https://docs.feast.dev/)
* [Quickstart](https://docs.feast.dev/getting-started/quickstart)
* [Tutorials](https://docs.feast.dev/tutorials/tutorials-overview)
- * [Running Feast with GCP/AWS](https://docs.feast.dev/how-to-guides/feast-gcp-aws)
+ * [Running Feast with Snowflake/GCP/AWS](https://docs.feast.dev/how-to-guides/feast-snowflake-gcp-aws)
* [Change Log](https://github.com/feast-dev/feast/blob/master/CHANGELOG.md)
* [Slack (#Feast)](https://slack.feast.dev/)
diff --git a/java/CONTRIBUTING.md b/java/CONTRIBUTING.md
index 1694b3f33f..86eacfef41 100644
--- a/java/CONTRIBUTING.md
+++ b/java/CONTRIBUTING.md
@@ -5,7 +5,6 @@
### Overview
This guide is targeted at developers looking to contribute to Feast components in
the feast-java Repository:
-- [Feast Core](#feast-core)
- [Feast Serving](#feast-serving)
- [Feast Java Client](#feast-java-client)
@@ -15,11 +14,14 @@ the feast-java Repository:
#### Common Setup
Common Environment Setup for all feast-java Feast components:
-1. . Ensure following development tools are installed:
-- Java SE Development Kit 11, Maven 3.6, `make`
+
+Ensure following development tools are installed:
+- Java SE Development Kit 11
+- Maven 3.6
+- `make`
#### Code Style
-feast-java's codebase conforms to the [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html).
+Feast's Java codebase conforms to the [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html).
Automatically format the code to conform the style guide by:
@@ -59,82 +61,8 @@ Specifically, proto-generated code is not indexed by IntelliJ. To fix this, navi
- target/generated-sources/protobuf/java
- target/generated-sources/annotations
-
-## Feast Core
-### Environment Setup
-Setting up your development environment for Feast Core:
-1. Complete the feast-java [Common Setup](#common-setup)
-2. Boot up a PostgreSQL instance (version 11 and above). Example of doing so via Docker:
-```sh
-# spawn a PostgreSQL instance as a Docker container running in the background
-docker run \
- --rm -it -d \
- --name postgres \
- -e POSTGRES_DB=postgres \
- -e POSTGRES_USER=postgres \
- -e POSTGRES_PASSWORD=password \
- -p 5432:5432 postgres:12-alpine
-```
-
-### Configuration
-Feast Core is configured using it's [application.yml](https://docs.feast.dev/reference/configuration-reference#1-feast-core-and-feast-online-serving).
-
-### Building and Running
-1. Build / Compile Feast Core with Maven to produce an executable Feast Core JAR
-```sh
-mvn package -pl core --also-make -Dmaven.test.skip=true
-```
-
-2. Run Feast Core using the built JAR:
-```sh
-# where X.X.X is the version of the Feast Core JAR built
-java -jar core/target/feast-core-X.X.X-exec.jar
-```
-
-### Unit / Integration Tests
-Unit & Integration Tests can be used to verify functionality:
-```sh
-# run unit tests
-mvn test -pl core --also-make
-# run integration tests
-mvn verify -pl core --also-make
-```
-
## Feast Serving
-### Environment Setup
-Setting up your development environment for Feast Serving:
-1. Complete the feast-java [Common Setup](#common-setup)
-2. Boot up a Redis instance (version 5.x). Example of doing so via Docker:
-```sh
-docker run --name redis --rm -it -d -p 6379:6379 redis:5-alpine
-```
-
-> Feast Serving requires a running Feast Core instance to retrieve Feature metadata
-> in order to serve features. See the [Feast Core section](#feast-core) for
-> how to get a Feast Core instance running.
-
-### Configuration
-Feast Serving is configured using it's [application.yml](https://docs.feast.dev/reference/configuration-reference#1-feast-core-and-feast-online-serving).
-
-### Building and Running
-1. Build / Compile Feast Serving with Maven to produce an executable Feast Serving JAR
-```sh
-mvn package -pl serving --also-make -Dmaven.test.skip=true
-
-2. Run Feast Serving using the built JAR:
-```sh
-# where X.X.X is the version of the Feast serving JAR built
-java -jar serving/target/feast-serving-X.X.X-exec.jar
-```
-
-### Unit / Integration Tests
-Unit & Integration Tests can be used to verify functionality:
-```sh
-# run unit tests
-mvn test -pl serving --also-make
-# run integration tests
-mvn verify -pl serving --also-make
-```
+See instructions [here](serving/README.md) for developing.
## Feast Java Client
### Environment Setup
@@ -144,9 +72,6 @@ Setting up your development environment for Feast Java SDK:
> Feast Java Client is a Java Client for retrieving Features from a running Feast Serving instance.
> See the [Feast Serving Section](#feast-serving) section for how to get a Feast Serving instance running.
-### Configuration
-Feast Java Client is [configured as code](https://docs.feast.dev/v/master/reference/configuration-reference#4-feast-java-and-go-sdk)
-
### Building
1. Build / Compile Feast Java Client with Maven:
diff --git a/java/README.md b/java/README.md
index 8d6141faa8..ff5a1b8553 100644
--- a/java/README.md
+++ b/java/README.md
@@ -1,5 +1,4 @@
# Feast Java components
-[![complete](https://github.com/feast-dev/feast-java/actions/workflows/complete.yml/badge.svg)](https://github.com/feast-dev/feast-java/actions/workflows/complete.yml)
### Overview
@@ -19,4 +18,4 @@ Guides on Contributing:
- [Development Guide for feast-java (this repository)](CONTRIBUTING.md)
### Installing using Helm
-Please see the Helm charts in [charts](https://github.com/feast-dev/feast-helm-charts).
+Please see the Helm charts in [infra/charts/feast](../infra/charts/feast).
diff --git a/java/common/pom.xml b/java/common/pom.xml
index 0c5651876e..e5a648a7f9 100644
--- a/java/common/pom.xml
+++ b/java/common/pom.xml
@@ -33,13 +33,14 @@
dev.feast
- datatypes-java
+ feast-datatypes${project.version}compilecom.google.protobufprotobuf-java-util
+ ${protobuf.version}
@@ -52,75 +53,34 @@
org.projectlomboklombok
+ ${lombok.version}com.google.auto.valueauto-value-annotations
+ ${auto.value.version}com.google.code.gsongson
+ ${gson.version}io.gsonfiregson-fire
+ ${gson.fire.version}com.fasterxml.jackson.corejackson-databind
+ 2.10.5.1com.fasterxml.jackson.datatypejackson-datatype-jsr310
-
-
-
-
- org.springframework
- spring-context-support
-
-
- net.devh
- grpc-server-spring-boot-starter
-
-
- org.springframework.boot
- spring-boot-starter-logging
-
-
-
-
- org.springframework.boot
- spring-boot-starter-data-jpa
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.hibernate.validator
- hibernate-validator
- 6.1.5.Final
-
-
-
-
- org.springframework.security
- spring-security-core
-
-
- org.springframework.security
- spring-security-config
-
-
- org.springframework.security
- spring-security-oauth2-resource-server
-
-
- org.springframework.security
- spring-security-oauth2-jose
+ 2.10.1
@@ -134,7 +94,6 @@
0.3.1
-
javax.xml.bindjaxb-api
@@ -156,6 +115,7 @@
org.hamcresthamcrest-librarytest
+ ${hamcrest.version}
@@ -163,28 +123,12 @@
junit4.13.2
-
- org.springframework
- spring-test
- test
- org.mockitomockito-core${mockito.version}test
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
- org.junit.vintage
- junit-vintage-engine
-
-
-
@@ -206,6 +150,13 @@
-Xms2048m -Xmx2048m -Djdk.net.URLClassPath.disableClassPathURLCheck=true
+
+ org.sonatype.plugins
+ nexus-staging-maven-plugin
+
+ true
+
+
diff --git a/java/common/src/main/java/feast/common/logging/AuditLogger.java b/java/common/src/main/java/feast/common/logging/AuditLogger.java
index 5f70fbfc97..f3538a794b 100644
--- a/java/common/src/main/java/feast/common/logging/AuditLogger.java
+++ b/java/common/src/main/java/feast/common/logging/AuditLogger.java
@@ -32,26 +32,23 @@
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
import org.slf4j.event.Level;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.info.BuildProperties;
-import org.springframework.stereotype.Component;
@Slf4j
-@Component
public class AuditLogger {
private static final String FLUENTD_DESTINATION = "fluentd";
private static final Marker AUDIT_MARKER = MarkerFactory.getMarker("AUDIT_MARK");
private static FluentLogger fluentLogger;
private static AuditLogProperties properties;
- private static BuildProperties buildProperties;
+ private static String artifact;
+ private static String version;
- @Autowired
- public AuditLogger(LoggingProperties loggingProperties, BuildProperties buildProperties) {
+ public AuditLogger(LoggingProperties loggingProperties, String artifact, String version) {
// Spring runs this constructor when creating the AuditLogger bean,
// which allows us to populate the AuditLogger class with dependencies.
// This allows us to use the dependencies in the AuditLogger's static methods
AuditLogger.properties = loggingProperties.getAudit();
- AuditLogger.buildProperties = buildProperties;
+ AuditLogger.artifact = artifact;
+ AuditLogger.version = version;
if (AuditLogger.properties.getMessageLogging() != null
&& AuditLogger.properties.getMessageLogging().isEnabled()) {
AuditLogger.fluentLogger =
@@ -69,12 +66,7 @@ public AuditLogger(LoggingProperties loggingProperties, BuildProperties buildPro
* @param entryBuilder with all fields set except instance.
*/
public static void logMessage(Level level, MessageAuditLogEntry.Builder entryBuilder) {
- log(
- level,
- entryBuilder
- .setComponent(buildProperties.getArtifact())
- .setVersion(buildProperties.getVersion())
- .build());
+ log(level, entryBuilder.setComponent(artifact).setVersion(version).build());
}
/**
@@ -90,10 +82,7 @@ public static void logAction(
log(
level,
ActionAuditLogEntry.of(
- buildProperties.getArtifact(),
- buildProperties.getArtifact(),
- LogResource.of(resourceType, resourceId),
- action));
+ artifact, version, LogResource.of(resourceType, resourceId), action));
}
/**
@@ -109,10 +98,7 @@ public static void logTransition(
log(
level,
TransitionAuditLogEntry.of(
- buildProperties.getArtifact(),
- buildProperties.getArtifact(),
- LogResource.of(resourceType, resourceId),
- status));
+ artifact, version, LogResource.of(resourceType, resourceId), status));
}
/**
diff --git a/java/common/src/main/java/feast/common/logging/interceptors/GrpcMessageInterceptor.java b/java/common/src/main/java/feast/common/logging/interceptors/GrpcMessageInterceptor.java
index ffd7c6b954..661642a89a 100644
--- a/java/common/src/main/java/feast/common/logging/interceptors/GrpcMessageInterceptor.java
+++ b/java/common/src/main/java/feast/common/logging/interceptors/GrpcMessageInterceptor.java
@@ -30,10 +30,6 @@
import io.grpc.ServerInterceptor;
import io.grpc.Status;
import org.slf4j.event.Level;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Component;
/**
* GrpcMessageInterceptor intercepts a GRPC calls to log handling of GRPC messages to the Audit Log.
@@ -41,7 +37,6 @@
* name and assumed authenticated identity (if authentication is enabled). NOTE:
* GrpcMessageInterceptor assumes that all service calls are unary (ie single request/response).
*/
-@Component
public class GrpcMessageInterceptor implements ServerInterceptor {
private LoggingProperties loggingProperties;
@@ -50,7 +45,6 @@ public class GrpcMessageInterceptor implements ServerInterceptor {
*
* @param loggingProperties properties used to configure logging interceptor.
*/
- @Autowired
public GrpcMessageInterceptor(LoggingProperties loggingProperties) {
this.loggingProperties = loggingProperties;
}
@@ -80,9 +74,7 @@ public Listener interceptCall(
entryBuilder.setMethod(fullMethodName.substring(fullMethodName.indexOf("/") + 1));
// Attempt Extract current authenticated identity.
- Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
- String identity = (authentication != null) ? getIdentity(authentication) : "";
- entryBuilder.setIdentity(identity);
+ entryBuilder.setIdentity("");
// Register forwarding call to intercept outgoing response and log to audit log
call =
@@ -115,13 +107,4 @@ public void onMessage(ReqT message) {
}
};
}
-
- /**
- * Extract current authenticated identity from given {@link Authentication}. Extracts subject
- * claim if specified in AuthorizationProperties, otherwise returns authentication subject.
- */
- private String getIdentity(Authentication authentication) {
- // use subject claim as identity if set in security authorization properties
- return authentication.getName();
- }
}
diff --git a/java/common/src/test/java/feast/common/logging/entry/AuditLogEntryTest.java b/java/common/src/test/java/feast/common/logging/entry/AuditLogEntryTest.java
index 0c96ee9c56..bc3dcbcf74 100644
--- a/java/common/src/test/java/feast/common/logging/entry/AuditLogEntryTest.java
+++ b/java/common/src/test/java/feast/common/logging/entry/AuditLogEntryTest.java
@@ -21,11 +21,12 @@
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
+import com.google.protobuf.Timestamp;
import feast.common.logging.entry.LogResource.ResourceType;
+import feast.proto.serving.ServingAPIProto;
import feast.proto.serving.ServingAPIProto.FeatureReferenceV2;
import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequestV2;
import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse;
-import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse.FieldValues;
import feast.proto.types.ValueProto.Value;
import io.grpc.Status;
import java.util.Arrays;
@@ -50,15 +51,24 @@ public List getTestAuditLogs() {
GetOnlineFeaturesResponse responseSpec =
GetOnlineFeaturesResponse.newBuilder()
- .addAllFieldValues(
+ .setMetadata(
+ ServingAPIProto.GetOnlineFeaturesResponseMetadata.newBuilder()
+ .setFeatureNames(
+ ServingAPIProto.FeatureList.newBuilder()
+ .addAllVal(
+ Arrays.asList(
+ "featuretable_1:feature_1", "featuretable_1:feature2"))))
+ .addAllResults(
Arrays.asList(
- FieldValues.newBuilder()
- .putFields(
- "featuretable_1:feature_1", Value.newBuilder().setInt32Val(32).build())
+ GetOnlineFeaturesResponse.FeatureVector.newBuilder()
+ .addValues(Value.newBuilder().setInt32Val(32).build())
+ .addStatuses(ServingAPIProto.FieldStatus.PRESENT)
+ .addEventTimestamps(Timestamp.newBuilder().build())
.build(),
- FieldValues.newBuilder()
- .putFields(
- "featuretable_1:feature2", Value.newBuilder().setInt32Val(64).build())
+ GetOnlineFeaturesResponse.FeatureVector.newBuilder()
+ .addValues(Value.newBuilder().setInt32Val(64).build())
+ .addStatuses(ServingAPIProto.FieldStatus.PRESENT)
+ .addEventTimestamps(Timestamp.newBuilder().build())
.build()))
.build();
diff --git a/java/datatypes/java/README.md b/java/datatypes/README.md
similarity index 100%
rename from java/datatypes/java/README.md
rename to java/datatypes/README.md
diff --git a/java/datatypes/java/src/main/proto/feast b/java/datatypes/java/src/main/proto/feast
deleted file mode 120000
index 53364e5f45..0000000000
--- a/java/datatypes/java/src/main/proto/feast
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../../protos/feast
\ No newline at end of file
diff --git a/java/datatypes/java/pom.xml b/java/datatypes/pom.xml
similarity index 83%
rename from java/datatypes/java/pom.xml
rename to java/datatypes/pom.xml
index fe6c380a10..a4f1932ada 100644
--- a/java/datatypes/java/pom.xml
+++ b/java/datatypes/pom.xml
@@ -27,16 +27,16 @@
definitions included in the package.
- 11
- 11
+ 8
+ 8
- datatypes-java
+ feast-datatypesdev.feastfeast-parent${revision}
- ../..
+ ../
@@ -75,6 +75,13 @@
+
+ org.sonatype.plugins
+ nexus-staging-maven-plugin
+
+ false
+
+
@@ -83,29 +90,34 @@
com.google.guavaguava
+ ${guava.version}com.google.protobufprotobuf-java
+ ${protobuf.version}io.grpcgrpc-core
+ ${grpc.version}io.grpcgrpc-protobuf
+ ${grpc.version}io.grpcgrpc-services
+ ${grpc.version}io.grpcgrpc-stub
+ ${grpc.version}
-
javax.annotationjavax.annotation-api
diff --git a/java/datatypes/src/main/proto/feast b/java/datatypes/src/main/proto/feast
new file mode 120000
index 0000000000..463e4045de
--- /dev/null
+++ b/java/datatypes/src/main/proto/feast
@@ -0,0 +1 @@
+../../../../../protos/feast
\ No newline at end of file
diff --git a/java/docs/coverage/java/pom.xml b/java/docs/coverage/pom.xml
similarity index 96%
rename from java/docs/coverage/java/pom.xml
rename to java/docs/coverage/pom.xml
index 5f79422496..f6e08909ee 100644
--- a/java/docs/coverage/java/pom.xml
+++ b/java/docs/coverage/pom.xml
@@ -30,7 +30,7 @@
dev.feastfeast-parent${revision}
- ../../..
+ ../..Feast Coverage Java
@@ -61,7 +61,7 @@
dev.feast
- feast-sdk
+ feast-serving-client${project.version}
diff --git a/java/infra/docker/feature-server/Dockerfile b/java/infra/docker/feature-server/Dockerfile
index a07d3301b2..dbd8c91472 100644
--- a/java/infra/docker/feature-server/Dockerfile
+++ b/java/infra/docker/feature-server/Dockerfile
@@ -7,14 +7,14 @@ FROM maven:3.6-jdk-11 as builder
WORKDIR /build
COPY java/pom.xml .
-COPY java/datatypes/java/pom.xml datatypes/java/pom.xml
+COPY java/datatypes/pom.xml datatypes/pom.xml
COPY java/common/pom.xml common/pom.xml
COPY java/serving/pom.xml serving/pom.xml
COPY java/storage/api/pom.xml storage/api/pom.xml
COPY java/storage/connectors/pom.xml storage/connectors/pom.xml
COPY java/storage/connectors/redis/pom.xml storage/connectors/redis/pom.xml
-COPY java/sdk/java/pom.xml sdk/java/pom.xml
-COPY java/docs/coverage/java/pom.xml docs/coverage/java/pom.xml
+COPY java/sdk/pom.xml sdk/pom.xml
+COPY java/docs/coverage/pom.xml docs/coverage/pom.xml
# Setting Maven repository .m2 directory relative to /build folder gives the
# user to optionally use cached repository when building the image by copying
@@ -24,7 +24,7 @@ COPY java/pom.xml .m2/* .m2/
RUN mvn dependency:go-offline -DexcludeGroupIds:dev.feast 2>/dev/null || true
COPY java/ .
-COPY protos/feast datatypes/java/src/main/proto/feast
+COPY protos/feast datatypes/src/main/proto/feast
ARG VERSION=dev
RUN mvn --also-make --projects serving -Drevision=$VERSION \
diff --git a/java/pom.xml b/java/pom.xml
index 38f037431c..013e2c9701 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -28,17 +28,17 @@
pom
- datatypes/java
+ datatypesstorage/apistorage/connectorsserving
- sdk/java
- docs/coverage/java
+ sdk
+ docs/coveragecommon
- 0.15.2-SNAPSHOT
+ 0.18.2-SNAPSHOThttps://github.com/feast-dev/feastUTF-8
@@ -46,11 +46,7 @@
1.30.23.12.2
- 3.12.2
- 2.3.1.RELEASE
- 5.2.7.RELEASE
- 5.3.0.RELEASE
- 2.9.0.RELEASE
+ 3.16.11.111.10.8.01.9.10
@@ -62,7 +58,6 @@
2.17.12.9.92.0.2
- 2.5.0.RELEASE1.18.121.8.42.8.6
@@ -72,9 +67,9 @@
2.3.11.3.22.0.1.Final
- 2.8.00.20.01.6.6
+ 29.0-jre
-
- org.apache.commons
- commons-lang3
- ${commons.lang3.version}
-
-
-
- com.google.inject
- guice
- 5.0.1
-
-
-
-
- com.google.cloud
- google-cloud-bigquery
- ${com.google.cloud.version}
-
-
- com.google.cloud
- google-cloud-storage
- ${com.google.cloud.version}
-
-
-
-
- com.google.cloud
- google-cloud-nio
- 0.83.0-alpha
-
-
-
- io.opencensus
- opencensus-api
- ${opencensus.version}
-
-
- io.opencensus
- opencensus-contrib-grpc-util
- ${opencensus.version}
-
-
- io.opencensus
- opencensus-contrib-http-util
- ${opencensus.version}
-
-
-
-
- io.grpc
- grpc-core
- ${grpc.version}
-
-
- io.grpc
- grpc-api
- ${grpc.version}
-
-
- io.grpc
- grpc-context
- ${grpc.version}
-
-
- io.grpc
- grpc-all
- ${grpc.version}
-
-
- io.grpc
- grpc-okhttp
- ${grpc.version}
-
-
- io.grpc
- grpc-auth
- ${grpc.version}
-
-
- io.grpc
- grpc-grpclb
- ${grpc.version}
-
-
- io.grpc
- grpc-alts
- ${grpc.version}
-
-
- io.grpc
- grpc-netty
- ${grpc.version}
-
-
- io.grpc
- grpc-netty-shaded
- ${grpc.version}
-
-
- io.grpc
- grpc-protobuf
- ${grpc.version}
-
-
- io.grpc
- grpc-services
- ${grpc.version}
-
-
- io.grpc
- grpc-stub
- ${grpc.version}
-
-
- io.grpc
- grpc-testing
- ${grpc.version}
- test
-
-
-
-
- org.apache.arrow
- arrow-java-root
- 5.0.0
- pom
-
-
-
-
- org.apache.arrow
- arrow-vector
- 5.0.0
-
-
-
-
- org.apache.arrow
- arrow-memory
- 5.0.0
- pom
-
-
-
-
- org.apache.arrow
- arrow-memory-netty
- 5.0.0
- runtime
-
-
-
-
- net.devh
- grpc-server-spring-boot-starter
- ${grpc.spring.boot.starter.version}
-
-
-
-
- io.prometheus
- simpleclient
- ${io.prometheus.version}
-
-
- io.prometheus
- simpleclient_servlet
- ${io.prometheus.version}
-
-
-
-
- org.springframework.security
- spring-security-core
- ${spring.security.version}
-
-
- org.springframework.security
- spring-security-config
- ${spring.security.version}
-
-
- org.springframework.security
- spring-security-oauth2-resource-server
- ${spring.security.version}
-
-
- org.springframework.security
- spring-security-oauth2-jose
- ${spring.security.version}
-
-
- com.google.auth
- google-auth-library-oauth2-http
- ${google.auth.library.oauth2.http.version}
-
-
-
-
- joda-time
- joda-time
- ${joda.time.version}
-
-
- com.datadoghq
- java-dogstatsd-client
- 2.6.1
-
-
- com.google.guava
- guava
- 29.0-jre
-
-
- com.google.protobuf
- protobuf-java
- ${protobuf.version}
-
-
- com.google.protobuf
- protobuf-java-util
- ${protobuf.version}
-
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
-
-
- com.google.auto.value
- auto-value-annotations
- ${auto.value.version}
-
-
- com.google.auto.value
- auto-value
- ${auto.value.version}
-
-
- com.google.code.gson
- gson
- ${gson.version}
-
-
- io.gsonfire
- gson-fire
- ${gson.fire.version}
-
-
-
- com.github.kstyrc
- embedded-redis
- 0.6
- test
-
-
-
-
-
- net.bytebuddy
- byte-buddy
- ${byte-buddy.version}
-
-
- org.mockito
- mockito-core
- ${mockito.version}
- test
-
-
- org.springframework.boot
- spring-boot-starter-web
- ${spring.boot.version}
-
-
- org.springframework.boot
- spring-boot-starter-logging
-
-
-
-
- org.apache.logging.log4j
- log4j-api
- ${log4jVersion}
-
-
- org.apache.logging.log4j
- log4j-core
- ${log4jVersion}
-
-
- org.apache.logging.log4j
- log4j-jul
- ${log4jVersion}
-
-
- org.apache.logging.log4j
- log4j-web
- ${log4jVersion}
- org.apache.logging.log4jlog4j-slf4j-impl
@@ -462,26 +156,6 @@
1.7.30
-
-
-
- org.springframework.boot
- spring-boot-dependencies
- ${spring.boot.version}
- pom
- import
-
-
- com.squareup.okio
- okio
- 1.17.2
- javax.xml.bindjaxb-api
@@ -497,6 +171,19 @@
validation-api${javax.validation.version}
+
+
+ org.junit.platform
+ junit-platform-engine
+ 1.8.2
+ test
+
+
+ org.junit.platform
+ junit-platform-commons
+ 1.8.2
+ test
+
@@ -535,7 +222,7 @@
- feast.proto.*:io.grpc.*:org.tensorflow.*
+ io.grpc.*:org.tensorflow.*
@@ -693,22 +380,6 @@
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
- true
-
-
-
- build-info
-
- build-info
-
-
-
- org.sonatype.plugins
@@ -720,6 +391,7 @@
https://oss.sonatype.org/true
+ true
@@ -137,6 +142,13 @@
org.jacocojacoco-maven-plugin
+
+ org.sonatype.plugins
+ nexus-staging-maven-plugin
+
+ false
+
+
diff --git a/java/sdk/java/src/main/java/dev/feast/FeastClient.java b/java/sdk/src/main/java/dev/feast/FeastClient.java
similarity index 98%
rename from java/sdk/java/src/main/java/dev/feast/FeastClient.java
rename to java/sdk/src/main/java/dev/feast/FeastClient.java
index e9aaab151a..c10a76ecf8 100644
--- a/java/sdk/java/src/main/java/dev/feast/FeastClient.java
+++ b/java/sdk/src/main/java/dev/feast/FeastClient.java
@@ -21,7 +21,7 @@
import feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest;
import feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse;
import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest;
-import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseV2;
+import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse;
import feast.proto.serving.ServingServiceGrpc;
import feast.proto.serving.ServingServiceGrpc.ServingServiceBlockingStub;
import feast.proto.types.ValueProto;
@@ -129,7 +129,7 @@ public List getOnlineFeatures(List featureRefs, List entities)
requestBuilder.putAllEntities(getEntityValuesMap(entities));
- GetOnlineFeaturesResponseV2 response = stub.getOnlineFeatures(requestBuilder.build());
+ GetOnlineFeaturesResponse response = stub.getOnlineFeatures(requestBuilder.build());
List results = Lists.newArrayList();
if (response.getResultsCount() == 0) {
diff --git a/java/sdk/java/src/main/java/dev/feast/RequestUtil.java b/java/sdk/src/main/java/dev/feast/RequestUtil.java
similarity index 100%
rename from java/sdk/java/src/main/java/dev/feast/RequestUtil.java
rename to java/sdk/src/main/java/dev/feast/RequestUtil.java
diff --git a/java/sdk/java/src/main/java/dev/feast/Row.java b/java/sdk/src/main/java/dev/feast/Row.java
similarity index 100%
rename from java/sdk/java/src/main/java/dev/feast/Row.java
rename to java/sdk/src/main/java/dev/feast/Row.java
diff --git a/java/sdk/java/src/main/java/dev/feast/SecurityConfig.java b/java/sdk/src/main/java/dev/feast/SecurityConfig.java
similarity index 100%
rename from java/sdk/java/src/main/java/dev/feast/SecurityConfig.java
rename to java/sdk/src/main/java/dev/feast/SecurityConfig.java
diff --git a/java/sdk/java/src/test/java/dev/feast/FeastClientTest.java b/java/sdk/src/test/java/dev/feast/FeastClientTest.java
similarity index 93%
rename from java/sdk/java/src/test/java/dev/feast/FeastClientTest.java
rename to java/sdk/src/test/java/dev/feast/FeastClientTest.java
index 3de5142a85..1dfb9989c9 100644
--- a/java/sdk/java/src/test/java/dev/feast/FeastClientTest.java
+++ b/java/sdk/src/test/java/dev/feast/FeastClientTest.java
@@ -24,7 +24,7 @@
import feast.proto.serving.ServingAPIProto;
import feast.proto.serving.ServingAPIProto.FieldStatus;
import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesRequest;
-import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponseV2;
+import feast.proto.serving.ServingAPIProto.GetOnlineFeaturesResponse;
import feast.proto.serving.ServingServiceGrpc.ServingServiceImplBase;
import feast.proto.types.ValueProto;
import feast.proto.types.ValueProto.Value;
@@ -57,7 +57,7 @@ public class FeastClientTest {
@Override
public void getOnlineFeatures(
GetOnlineFeaturesRequest request,
- StreamObserver responseObserver) {
+ StreamObserver responseObserver) {
if (!request.equals(FeastClientTest.getFakeRequest())) {
responseObserver.onError(Status.FAILED_PRECONDITION.asRuntimeException());
}
@@ -137,22 +137,22 @@ private static GetOnlineFeaturesRequest getFakeRequest() {
.build();
}
- private static GetOnlineFeaturesResponseV2 getFakeResponse() {
- return GetOnlineFeaturesResponseV2.newBuilder()
+ private static GetOnlineFeaturesResponse getFakeResponse() {
+ return GetOnlineFeaturesResponse.newBuilder()
.addResults(
- GetOnlineFeaturesResponseV2.FeatureVector.newBuilder()
+ GetOnlineFeaturesResponse.FeatureVector.newBuilder()
.addValues(strValue("david"))
.addStatuses(FieldStatus.PRESENT)
.addEventTimestamps(Timestamp.newBuilder())
.build())
.addResults(
- GetOnlineFeaturesResponseV2.FeatureVector.newBuilder()
+ GetOnlineFeaturesResponse.FeatureVector.newBuilder()
.addValues(intValue(3))
.addStatuses(FieldStatus.PRESENT)
.addEventTimestamps(Timestamp.newBuilder())
.build())
.addResults(
- GetOnlineFeaturesResponseV2.FeatureVector.newBuilder()
+ GetOnlineFeaturesResponse.FeatureVector.newBuilder()
.addValues(Value.newBuilder().build())
.addStatuses(FieldStatus.NULL_VALUE)
.addEventTimestamps(Timestamp.newBuilder())
diff --git a/java/sdk/java/src/test/java/dev/feast/RequestUtilTest.java b/java/sdk/src/test/java/dev/feast/RequestUtilTest.java
similarity index 96%
rename from java/sdk/java/src/test/java/dev/feast/RequestUtilTest.java
rename to java/sdk/src/test/java/dev/feast/RequestUtilTest.java
index 21fb145b24..e5684ecd18 100644
--- a/java/sdk/java/src/test/java/dev/feast/RequestUtilTest.java
+++ b/java/sdk/src/test/java/dev/feast/RequestUtilTest.java
@@ -21,7 +21,6 @@
import com.google.common.collect.ImmutableList;
import com.google.protobuf.TextFormat;
-import feast.common.models.Feature;
import feast.proto.serving.ServingAPIProto.FeatureReferenceV2;
import java.util.Arrays;
import java.util.Comparator;
@@ -68,7 +67,9 @@ void renderFeatureRef_ShouldReturnFeatureRefString(
List expected, List input) {
input = input.stream().map(ref -> ref.toBuilder().build()).collect(Collectors.toList());
List actual =
- input.stream().map(ref -> Feature.getFeatureReference(ref)).collect(Collectors.toList());
+ input.stream()
+ .map(ref -> String.format("%s:%s", ref.getFeatureViewName(), ref.getFeatureName()))
+ .collect(Collectors.toList());
assertEquals(expected.size(), actual.size());
for (int i = 0; i < expected.size(); i++) {
assertEquals(expected.get(i), actual.get(i));
diff --git a/java/serving/README.md b/java/serving/README.md
index cce8c7d6e2..5ac7194924 100644
--- a/java/serving/README.md
+++ b/java/serving/README.md
@@ -1,101 +1,139 @@
-### Getting Started Guide for Feast Serving Developers
+## Getting Started Guide for Feast Serving Developers
-Pre-requisites:
+### Overview
+This guide is targeted at developers looking to contribute to Feast Serving:
+- [Building and running Feast Serving locally](#building-and-running-feast-serving-locally)
+
+### Pre-requisites:
- [Maven](https://maven.apache.org/install.html) build tool version 3.6.x
-- A running Feast Core instance
-- A running Store instance e.g. local Redis Store instance
+- A Feast feature repo (e.g. https://github.com/feast-dev/feast-demo)
+- A running Store instance e.g. local Redis instance with `redis-server`
-From the Feast project root directory, run the following Maven command to start Feast Serving gRPC service running on port 6566 locally:
+### Building and running Feast Serving locally:
+From the Feast GitHub root, run:
-```bash
-# Assumptions:
-# - Local Feast Core is running on localhost:6565
-# Uses configuration from serving/src/main/resources/application.yml
-mvn -pl serving spring-boot:run -Dspring-boot.run.arguments=\
---feast.core-host=localhost,\
---feast.core-port=6565
-```
+1. `mvn -f java/pom.xml install -Dmaven.test.skip=true`
+2. Package an executable jar for serving: `mvn -f java/serving/pom.xml package -Dmaven.test.skip=true`
+3. Make a file called `application-override.yaml` that specifies your Feast repo project and registry path:
+ 1. Note if you have a remote registry, you can specify that too (e.g. `gs://...`)
+ ```yaml
+ feast:
+ project: feast_demo
+ registry: /Users/[your username]/GitHub/feast-demo/feature_repo/data/registry.db
+ ```
+ 2. An example of if you're using Redis with a remote registry:
+ ```yaml
+ feast:
+ project: feast_java_demo
+ registry: gs://[YOUR BUCKET]/demo-repo/registry.db
+ activeStore: online
+ stores:
+ - name: online
+ type: REDIS
+ config:
+ host: localhost
+ port: 6379
+ password: [YOUR PASSWORD]
+ ```
+4. Run the jar with dependencies that was built from Maven (note the version might vary):
+ ```
+ java \
+ -Xms1g \
+ -Xmx4g \
+ -jar java/serving/target/feast-serving-0.17.1-SNAPSHOT-jar-with-dependencies.jar \
+ classpath:/application.yml,file:./application-override.yaml
+ ```
+5. Now you have a Feast Serving gRPC service running on port 6566 locally!
+### Running test queries
If you have [grpc_cli](https://github.com/grpc/grpc/blob/master/doc/command_line_tool.md) installed, you can check that Feast Serving is running
```
grpc_cli ls localhost:6566
-grpc_cli call localhost:6566 GetFeastServingVersion ''
-grpc_cli call localhost:6566 GetFeastServingType ''
```
+An example of fetching features
```bash
-grpc_cli call localhost:6565 ApplyFeatureSet '
-feature_set {
- name: "driver"
- entities {
- name: "driver_id"
- value_type: STRING
- }
- features {
- name: "city"
- value_type: STRING
- }
- features {
- name: "booking_completed_count"
- value_type: INT64
- }
- source {
- type: KAFKA
- kafka_source_config {
- bootstrap_servers: "localhost:9092"
+grpc_cli call localhost:6566 GetOnlineFeatures '
+features {
+ val: "driver_hourly_stats:conv_rate"
+ val: "driver_hourly_stats:acc_rate"
+}
+entities {
+ key: "driver_id"
+ value {
+ val {
+ int64_val: 1001
+ }
+ val {
+ int64_val: 1002
}
}
}
'
-
-grpc_cli call localhost:6565 GetFeatureSets '
-filter {
- feature_set_name: "driver"
+```
+Example output:
+```
+connecting to localhost:6566
+metadata {
+ feature_names {
+ val: "driver_hourly_stats:conv_rate"
+ val: "driver_hourly_stats:acc_rate"
+ }
}
-'
-
-grpc_cli call localhost:6566 GetBatchFeatures '
-feature_sets {
- name: "driver"
- feature_names: "booking_completed_count"
- max_age {
- seconds: 86400
+results {
+ values {
+ float_val: 0.812357187
+ }
+ values {
+ float_val: 0.379484832
+ }
+ statuses: PRESENT
+ statuses: PRESENT
+ event_timestamps {
+ seconds: 1631725200
+ }
+ event_timestamps {
+ seconds: 1631725200
}
}
-entity_dataset {
- entity_names: "driver_id"
- entity_dataset_rows {
- entity_timestamp {
- seconds: 1569873954
- }
+results {
+ values {
+ float_val: 0.840873241
+ }
+ values {
+ float_val: 0.151376978
+ }
+ statuses: PRESENT
+ statuses: PRESENT
+ event_timestamps {
+ seconds: 1631725200
+ }
+ event_timestamps {
+ seconds: 1631725200
}
}
-'
+Rpc succeeded with OK status
```
+### Debugging Feast Serving
+You can debug this like any other Java executable. Swap the java command above with:
```
-python3 <org.apache.maven.pluginsmaven-jar-plugin
+ 3.2.2
@@ -87,10 +88,15 @@
dev.feast
- datatypes-java
+ feast-datatypes${project.version}
+
+ dev.feast
+ feast-common
+ ${project.version}
+ dev.feast
@@ -119,38 +125,50 @@
org.slf4jslf4j-simple
+ 1.7.30org.apache.logging.log4jlog4j-web
+ ${log4jVersion}io.grpcgrpc-services
+ ${grpc.version}io.grpcgrpc-stub
+ ${grpc.version}
+
+
+ io.grpc
+ grpc-netty-shaded
+ ${grpc.version}com.google.protobufprotobuf-java-util
+ ${protobuf.version}com.google.guavaguava
+ ${guava.version}joda-timejoda-time
+ ${joda.time.version}
@@ -198,7 +216,7 @@
com.google.auto.valueauto-value-annotations
- 1.6.6
+ ${auto.value.version}
@@ -231,11 +249,13 @@
io.grpcgrpc-testing
+ ${grpc.version}org.mockitomockito-core
+ ${mockito.version}test
@@ -281,11 +301,19 @@
com.fasterxml.jackson.dataformatjackson-dataformat-yaml
+ 2.11.0
+
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ 2.12.2com.github.kstyrcembedded-redis
+ 0.6test
@@ -340,6 +368,13 @@
false
+
+ org.sonatype.plugins
+ nexus-staging-maven-plugin
+
+ true
+
+
diff --git a/java/serving/src/main/java/feast/serving/config/ApplicationProperties.java b/java/serving/src/main/java/feast/serving/config/ApplicationProperties.java
index 2e2448ca90..791c871e59 100644
--- a/java/serving/src/main/java/feast/serving/config/ApplicationProperties.java
+++ b/java/serving/src/main/java/feast/serving/config/ApplicationProperties.java
@@ -147,38 +147,46 @@ public TracingProperties getTracing() {
public LoggingProperties getLogging() {
return logging;
}
- }
- private FeastProperties feast;
+ private String gcpProject;
- public void setFeast(FeastProperties feast) {
- this.feast = feast;
- }
+ public String getGcpProject() {
+ return gcpProject;
+ }
- public FeastProperties getFeast() {
- return feast;
- }
+ public void setGcpProject(String gcpProject) {
+ this.gcpProject = gcpProject;
+ }
- private String gcpProject;
+ public void setAwsRegion(String awsRegion) {
+ this.awsRegion = awsRegion;
+ }
- public String getGcpProject() {
- return gcpProject;
- }
+ private String awsRegion;
- public void setAwsRegion(String awsRegion) {
- this.awsRegion = awsRegion;
- }
+ public String getAwsRegion() {
+ return awsRegion;
+ }
+
+ private String transformationServiceEndpoint;
- private String awsRegion;
+ public String getTransformationServiceEndpoint() {
+ return transformationServiceEndpoint;
+ }
- public String getAwsRegion() {
- return awsRegion;
+ public void setTransformationServiceEndpoint(String transformationServiceEndpoint) {
+ this.transformationServiceEndpoint = transformationServiceEndpoint;
+ }
}
- private String transformationServiceEndpoint;
+ private FeastProperties feast;
- public String getTransformationServiceEndpoint() {
- return transformationServiceEndpoint;
+ public void setFeast(FeastProperties feast) {
+ this.feast = feast;
+ }
+
+ public FeastProperties getFeast() {
+ return feast;
}
/** Store configuration class for database that this Feast Serving uses. */
@@ -263,6 +271,10 @@ public static class Server {
public int getPort() {
return port;
}
+
+ public void setPort(int port) {
+ this.port = port;
+ }
}
public static class GrpcServer {
@@ -271,6 +283,10 @@ public static class GrpcServer {
public Server getServer() {
return server;
}
+
+ public void setServer(Server server) {
+ this.server = server;
+ }
}
public static class RestServer {
@@ -279,6 +295,10 @@ public static class RestServer {
public Server getServer() {
return server;
}
+
+ public void setServer(Server server) {
+ this.server = server;
+ }
}
private GrpcServer grpc;
@@ -288,10 +308,18 @@ public GrpcServer getGrpc() {
return grpc;
}
+ public void setGrpc(GrpcServer grpc) {
+ this.grpc = grpc;
+ }
+
public RestServer getRest() {
return rest;
}
+ public void setRest(RestServer rest) {
+ this.rest = rest;
+ }
+
public enum StoreType {
REDIS,
REDIS_CLUSTER;
diff --git a/java/serving/src/main/java/feast/serving/config/RegistryConfig.java b/java/serving/src/main/java/feast/serving/config/RegistryConfig.java
index d23ab374d8..3e7cbe3f1f 100644
--- a/java/serving/src/main/java/feast/serving/config/RegistryConfig.java
+++ b/java/serving/src/main/java/feast/serving/config/RegistryConfig.java
@@ -31,7 +31,7 @@ public class RegistryConfig extends AbstractModule {
@Provides
Storage googleStorage(ApplicationProperties applicationProperties) {
return StorageOptions.newBuilder()
- .setProjectId(applicationProperties.getGcpProject())
+ .setProjectId(applicationProperties.getFeast().getGcpProject())
.build()
.getService();
}
@@ -39,7 +39,7 @@ Storage googleStorage(ApplicationProperties applicationProperties) {
@Provides
public AmazonS3 awsStorage(ApplicationProperties applicationProperties) {
return AmazonS3ClientBuilder.standard()
- .withRegion(applicationProperties.getAwsRegion())
+ .withRegion(applicationProperties.getFeast().getAwsRegion())
.build();
}
diff --git a/java/serving/src/main/java/feast/serving/config/ServerModule.java b/java/serving/src/main/java/feast/serving/config/ServerModule.java
index cb3a18cf95..5428306f2b 100644
--- a/java/serving/src/main/java/feast/serving/config/ServerModule.java
+++ b/java/serving/src/main/java/feast/serving/config/ServerModule.java
@@ -18,9 +18,12 @@
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
+import feast.serving.controller.HealthServiceController;
import feast.serving.grpc.OnlineServingGrpcServiceV2;
+import feast.serving.service.ServingServiceV2;
import io.grpc.Server;
import io.grpc.ServerBuilder;
+import io.grpc.health.v1.HealthGrpc;
import io.grpc.protobuf.services.ProtoReflectionService;
import io.opentracing.contrib.grpc.TracingServerInterceptor;
@@ -35,13 +38,20 @@ protected void configure() {
public Server provideGrpcServer(
ApplicationProperties applicationProperties,
OnlineServingGrpcServiceV2 onlineServingGrpcServiceV2,
- TracingServerInterceptor tracingServerInterceptor) {
+ TracingServerInterceptor tracingServerInterceptor,
+ HealthGrpc.HealthImplBase healthImplBase) {
ServerBuilder> serverBuilder =
ServerBuilder.forPort(applicationProperties.getGrpc().getServer().getPort());
serverBuilder
.addService(ProtoReflectionService.newInstance())
- .addService(tracingServerInterceptor.intercept(onlineServingGrpcServiceV2));
+ .addService(tracingServerInterceptor.intercept(onlineServingGrpcServiceV2))
+ .addService(healthImplBase);
return serverBuilder.build();
}
+
+ @Provides
+ public HealthGrpc.HealthImplBase healthService(ServingServiceV2 servingServiceV2) {
+ return new HealthServiceController(servingServiceV2);
+ }
}
diff --git a/java/serving/src/main/java/feast/serving/config/ServingApiConfiguration.java b/java/serving/src/main/java/feast/serving/config/ServingApiConfiguration.java
deleted file mode 100644
index ce4fe13437..0000000000
--- a/java/serving/src/main/java/feast/serving/config/ServingApiConfiguration.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * SPDX-License-Identifier: Apache-2.0
- * Copyright 2018-2019 The Feast Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package feast.serving.config;
-
-import java.util.List;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.http.converter.HttpMessageConverter;
-import org.springframework.http.converter.protobuf.ProtobufJsonFormatHttpMessageConverter;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-@Configuration
-public class ServingApiConfiguration implements WebMvcConfigurer {
- @Autowired private ProtobufJsonFormatHttpMessageConverter protobufConverter;
-
- @Bean
- ProtobufJsonFormatHttpMessageConverter protobufHttpMessageConverter() {
- return new ProtobufJsonFormatHttpMessageConverter();
- }
-
- @Override
- public void configureMessageConverters(List> converters) {
- converters.add(protobufConverter);
- }
-}
diff --git a/java/serving/src/main/java/feast/serving/config/ServingServiceConfigV2.java b/java/serving/src/main/java/feast/serving/config/ServingServiceConfigV2.java
index d3fe1ba116..4ea0692ccd 100644
--- a/java/serving/src/main/java/feast/serving/config/ServingServiceConfigV2.java
+++ b/java/serving/src/main/java/feast/serving/config/ServingServiceConfigV2.java
@@ -68,10 +68,10 @@ public ServingServiceV2 registryBasedServingServiceV2(
log.info("Working Directory = " + System.getProperty("user.dir"));
- final String transformationServiceEndpoint =
- applicationProperties.getTransformationServiceEndpoint();
final OnlineTransformationService onlineTransformationService =
- new OnlineTransformationService(transformationServiceEndpoint, registryRepository);
+ new OnlineTransformationService(
+ applicationProperties.getFeast().getTransformationServiceEndpoint(),
+ registryRepository);
servingService =
new OnlineServingServiceV2(
diff --git a/java/serving/src/main/java/feast/serving/config/WebSecurityConfig.java b/java/serving/src/main/java/feast/serving/config/WebSecurityConfig.java
deleted file mode 100644
index 04d3f4b5af..0000000000
--- a/java/serving/src/main/java/feast/serving/config/WebSecurityConfig.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SPDX-License-Identifier: Apache-2.0
- * Copyright 2018-2020 The Feast Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package feast.serving.config;
-
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-
-/**
- * WebSecurityConfig disables auto configuration of Spring HTTP Security and allows security methods
- * to be overridden
- */
-@Configuration
-@EnableWebSecurity
-public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
-
- /**
- * Allows for custom web security rules to be applied.
- *
- * @param http {@link HttpSecurity} for configuring web based security
- * @throws Exception exception
- */
- @Override
- protected void configure(HttpSecurity http) throws Exception {
-
- // Bypasses security/authentication for the following paths
- http.authorizeRequests()
- .antMatchers("/actuator/**", "/metrics/**")
- .permitAll()
- .anyRequest()
- .authenticated()
- .and()
- .csrf()
- .disable();
- }
-}
diff --git a/java/serving/src/main/java/feast/serving/controller/HealthServiceController.java b/java/serving/src/main/java/feast/serving/controller/HealthServiceController.java
index ef675d4c15..2f98ae032f 100644
--- a/java/serving/src/main/java/feast/serving/controller/HealthServiceController.java
+++ b/java/serving/src/main/java/feast/serving/controller/HealthServiceController.java
@@ -16,24 +16,20 @@
*/
package feast.serving.controller;
+import com.google.inject.Inject;
import feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest;
-import feast.serving.interceptors.GrpcMonitoringInterceptor;
import feast.serving.service.ServingServiceV2;
import io.grpc.health.v1.HealthGrpc.HealthImplBase;
import io.grpc.health.v1.HealthProto.HealthCheckRequest;
import io.grpc.health.v1.HealthProto.HealthCheckResponse;
import io.grpc.health.v1.HealthProto.ServingStatus;
import io.grpc.stub.StreamObserver;
-import net.devh.boot.grpc.server.service.GrpcService;
-import org.springframework.beans.factory.annotation.Autowired;
// Reference: https://github.com/grpc/grpc/blob/master/doc/health-checking.md
-
-@GrpcService(interceptors = {GrpcMonitoringInterceptor.class})
public class HealthServiceController extends HealthImplBase {
private final ServingServiceV2 servingService;
- @Autowired
+ @Inject
public HealthServiceController(final ServingServiceV2 servingService) {
this.servingService = servingService;
}
diff --git a/java/serving/src/main/java/feast/serving/controller/ServingServiceGRpcController.java b/java/serving/src/main/java/feast/serving/controller/ServingServiceGRpcController.java
deleted file mode 100644
index 0f4ef7b5ae..0000000000
--- a/java/serving/src/main/java/feast/serving/controller/ServingServiceGRpcController.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * SPDX-License-Identifier: Apache-2.0
- * Copyright 2018-2019 The Feast Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package feast.serving.controller;
-
-import feast.proto.serving.ServingAPIProto;
-import feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest;
-import feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse;
-import feast.proto.serving.ServingServiceGrpc.ServingServiceImplBase;
-import feast.serving.config.ApplicationProperties;
-import feast.serving.exception.SpecRetrievalException;
-import feast.serving.service.ServingServiceV2;
-import feast.serving.util.RequestHelper;
-import io.grpc.Status;
-import io.grpc.stub.StreamObserver;
-import io.opentracing.Span;
-import io.opentracing.Tracer;
-import org.slf4j.Logger;
-
-public class ServingServiceGRpcController extends ServingServiceImplBase {
-
- private static final Logger log =
- org.slf4j.LoggerFactory.getLogger(ServingServiceGRpcController.class);
- private final ServingServiceV2 servingServiceV2;
- private final String version;
- private final Tracer tracer;
-
- public ServingServiceGRpcController(
- ServingServiceV2 servingServiceV2,
- ApplicationProperties applicationProperties,
- Tracer tracer) {
- this.servingServiceV2 = servingServiceV2;
- this.version = applicationProperties.getFeast().getVersion();
- this.tracer = tracer;
- }
-
- @Override
- public void getFeastServingInfo(
- GetFeastServingInfoRequest request,
- StreamObserver responseObserver) {
- GetFeastServingInfoResponse feastServingInfo = servingServiceV2.getFeastServingInfo(request);
- feastServingInfo = feastServingInfo.toBuilder().setVersion(version).build();
- responseObserver.onNext(feastServingInfo);
- responseObserver.onCompleted();
- }
-
- @Override
- public void getOnlineFeatures(
- ServingAPIProto.GetOnlineFeaturesRequest request,
- StreamObserver responseObserver) {
- try {
- // authorize for the project in request object.
- RequestHelper.validateOnlineRequest(request);
- Span span = tracer.buildSpan("getOnlineFeaturesV2").start();
- ServingAPIProto.GetOnlineFeaturesResponseV2 onlineFeatures =
- servingServiceV2.getOnlineFeatures(request);
- if (span != null) {
- span.finish();
- }
-
- responseObserver.onNext(onlineFeatures);
- responseObserver.onCompleted();
- } catch (SpecRetrievalException e) {
- log.error("Failed to retrieve specs from Registry", e);
- responseObserver.onError(
- Status.NOT_FOUND.withDescription(e.getMessage()).withCause(e).asException());
- } catch (Exception e) {
- log.warn("Failed to get Online Features", e);
- responseObserver.onError(
- Status.INTERNAL.withDescription(e.getMessage()).withCause(e).asRuntimeException());
- }
- }
-}
diff --git a/java/serving/src/main/java/feast/serving/controller/ServingServiceRestController.java b/java/serving/src/main/java/feast/serving/controller/ServingServiceRestController.java
deleted file mode 100644
index fe8f13d8bc..0000000000
--- a/java/serving/src/main/java/feast/serving/controller/ServingServiceRestController.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * SPDX-License-Identifier: Apache-2.0
- * Copyright 2018-2019 The Feast Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package feast.serving.controller;
-
-import static feast.serving.util.mappers.ResponseJSONMapper.mapGetOnlineFeaturesResponse;
-
-import feast.proto.serving.ServingAPIProto;
-import feast.proto.serving.ServingAPIProto.GetFeastServingInfoRequest;
-import feast.proto.serving.ServingAPIProto.GetFeastServingInfoResponse;
-import feast.serving.config.ApplicationProperties;
-import feast.serving.service.ServingServiceV2;
-import feast.serving.util.RequestHelper;
-import java.util.List;
-import java.util.Map;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-public class ServingServiceRestController {
-
- private final ServingServiceV2 servingService;
- private final String version;
-
- public ServingServiceRestController(
- ServingServiceV2 servingService, ApplicationProperties applicationProperties) {
- this.servingService = servingService;
- this.version = applicationProperties.getFeast().getVersion();
- }
-
- @RequestMapping(value = "/api/v1/info", produces = "application/json")
- public GetFeastServingInfoResponse getInfo() {
- GetFeastServingInfoResponse feastServingInfo =
- servingService.getFeastServingInfo(GetFeastServingInfoRequest.getDefaultInstance());
- return feastServingInfo.toBuilder().setVersion(version).build();
- }
-
- @RequestMapping(
- value = "/api/v1/features/online",
- produces = "application/json",
- consumes = "application/json")
- public List