diff --git a/README.md b/README.md
index 13c5db443c..ede28c4c95 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,6 @@
[![GitHub Release](https://img.shields.io/github/v/release/feast-dev/feast.svg?style=flat&sort=semver&color=blue)](https://github.com/feast-dev/feast/releases)
## Join us on Slack!
-
👋👋👋 [Come say hi on Slack!](https://join.slack.com/t/feastopensource/signup)
## Overview
@@ -231,4 +230,4 @@ Thanks goes to these incredible people:
-
+
\ No newline at end of file
diff --git a/infra/charts/feast-feature-server/README.md b/infra/charts/feast-feature-server/README.md
index 63ff7cf61b..bff7820d1f 100644
--- a/infra/charts/feast-feature-server/README.md
+++ b/infra/charts/feast-feature-server/README.md
@@ -44,8 +44,12 @@ See [here](https://github.com/feast-dev/feast/tree/master/examples/python-helm-d
| imagePullSecrets | list | `[]` | |
| livenessProbe.initialDelaySeconds | int | `30` | |
| livenessProbe.periodSeconds | int | `30` | |
+| metrics.enabled | bool | `false` | |
+| metrics.otelCollector.endpoint | string | `""` | |
+| metrics.otelCollector.port | int | `4317` | |
| nameOverride | string | `""` | |
| nodeSelector | object | `{}` | |
+| otel_service.name | string | `"otelcol"` | |
| podAnnotations | object | `{}` | |
| podSecurityContext | object | `{}` | |
| readinessProbe.initialDelaySeconds | int | `20` | |
diff --git a/infra/charts/feast-feature-server/opentelemetry.md b/infra/charts/feast-feature-server/opentelemetry.md
new file mode 100644
index 0000000000..fc0930821e
--- /dev/null
+++ b/infra/charts/feast-feature-server/opentelemetry.md
@@ -0,0 +1,108 @@
+## Adding Monitoring
+To add monitoring to the Feast Feature Server, follow these steps:
+
+### Workflow
+
+Feast instrumentation Using OpenTelemetry and Prometheus -
+![Workflow](samples/workflow.png)
+
+### Deploy Prometheus Operator
+Follow the Prometheus Operator documentation to install the operator -
+https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/getting-started.md
+
+### Deploy OpenTelemetry Operator
+Before installing OTEL Operator, install `cert-manager` and validate the `pods` should spin up --
+```
+kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
+```
+
+Follow the documentation for further installation steps -
+https://github.com/open-telemetry/opentelemetry-operator
+
+### Configure OpenTelemetry Collector
+Add the OpenTelemetry Collector configuration under the metrics section in your values.yaml file.
+
+Example values.yaml:
+
+```
+metrics:
+ enabled: true
+ otelCollector:
+ endpoint: "otel-collector.default.svc.cluster.local:4317" #sample
+ headers:
+ api-key: "your-api-key"
+```
+
+### Add instrumentation annotation and environment variables in the deployment.yaml
+
+```
+template:
+ metadata:
+ {{- with .Values.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ instrumentation.opentelemetry.io/inject-python: "true"
+```
+
+```
+- name: OTEL_EXPORTER_OTLP_ENDPOINT
+ value: http://{{ .Values.service.name }}-collector.{{ .Release.namespace }}.svc.cluster.local:{{ .Values.metrics.endpoint.port}}
+- name: OTEL_EXPORTER_OTLP_INSECURE
+ value: "true"
+```
+
+### Add checks
+Add metric checks to all manifests and deployment file -
+
+```
+{{ if .Values.metrics.enabled }}
+apiVersion: opentelemetry.io/v1alpha1
+kind: Instrumentation
+metadata:
+ name: feast-instrumentation
+spec:
+ exporter:
+ endpoint: http://{{ .Values.service.name }}-collector.{{ .Release.Namespace }}.svc.cluster.local:4318 # This is the default port for the OpenTelemetry Collector
+ env:
+ propagators:
+ - tracecontext
+ - baggage
+ python:
+ env:
+ - name: OTEL_METRICS_EXPORTER
+ value: console,otlp_proto_http
+ - name: OTEL_LOGS_EXPORTER
+ value: otlp_proto_http
+ - name: OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED
+ value: "true"
+{{end}}
+```
+
+### Add manifests to the chart
+Add Instrumentation, OpenTelemetryCollector, ServiceMonitors, Prometheus Instance and RBAC rules as provided in the [samples/](https://github.com/feast-dev/feast/tree/91540703c483f1cd03b534a1a45bc4ccdcf79f81/infra/charts/feast-feature-server/samples) directory.
+
+For latest updates please refer the official repository - https://github.com/open-telemetry/opentelemetry-operator
+
+### Deploy Feast
+Deploy Feast and set `metrics` value to `true`.
+
+Example -
+```
+helm install feast-release infra/charts/feast-feature-server --set metric=true --set feature_store_yaml_base64=""
+```
+
+## See logs
+Once the opentelemetry is deployed, you can search the logs to see the required metrics -
+
+```
+oc logs otelcol-collector-0 | grep "Name: feast_feature_server_memory_usage\|Value: 0.*"
+oc logs otelcol-collector-0 | grep "Name: feast_feature_server_cpu_usage\|Value: 0.*"
+```
+```
+ -> Name: feast_feature_server_memory_usage
+Value: 0.579426
+```
+```
+-> Name: feast_feature_server_cpu_usage
+Value: 0.000000
+```
diff --git a/infra/charts/feast-feature-server/samples/instrumentation.yaml b/infra/charts/feast-feature-server/samples/instrumentation.yaml
new file mode 100644
index 0000000000..8ade7ee1bd
--- /dev/null
+++ b/infra/charts/feast-feature-server/samples/instrumentation.yaml
@@ -0,0 +1,19 @@
+apiVersion: opentelemetry.io/v1alpha1
+kind: Instrumentation
+metadata:
+ name: feast-instrumentation
+spec:
+ exporter:
+ endpoint: # eg: http://{{ .Values.service.name }}-collector.{{ .Release.Namespace }}.svc.cluster.local:4318
+ env:
+ propagators:
+ - tracecontext
+ - baggage
+ python:
+ env:
+ - name: OTEL_METRICS_EXPORTER
+ value: console,otlp_proto_http
+ - name: OTEL_LOGS_EXPORTER
+ value: otlp_proto_http
+ - name: OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED
+ value: "true"
\ No newline at end of file
diff --git a/infra/charts/feast-feature-server/samples/otel-collector.yaml b/infra/charts/feast-feature-server/samples/otel-collector.yaml
new file mode 100644
index 0000000000..d35a957e9b
--- /dev/null
+++ b/infra/charts/feast-feature-server/samples/otel-collector.yaml
@@ -0,0 +1,53 @@
+# API reference https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/api.md
+# Refs for v1beta1 config: https://github.com/open-telemetry/opentelemetry-operator/issues/3011#issuecomment-2154118998
+apiVersion: opentelemetry.io/v1beta1
+kind: OpenTelemetryCollector
+metadata:
+ name: otelcol
+spec:
+ mode: statefulset
+ image: otel/opentelemetry-collector-contrib:0.102.1
+ targetAllocator:
+ enabled: true
+ serviceAccount: opentelemetry-targetallocator-sa
+ prometheusCR:
+ enabled: true
+ podMonitorSelector: {}
+ serviceMonitorSelector: {}
+ ## If uncommented, only service monitors with this label will get picked up
+ # app: feast
+ config:
+ receivers:
+ otlp:
+ protocols:
+ grpc: {}
+ http: {}
+ prometheus:
+ config:
+ scrape_configs:
+ - job_name: 'otelcol-collector'
+ scrape_interval: 10s
+ static_configs:
+ - targets: [ '0.0.0.0:8888' ]
+
+ processors:
+ batch: {}
+
+ exporters:
+ logging:
+ verbosity: detailed
+
+ service:
+ pipelines:
+ traces:
+ receivers: [otlp]
+ processors: [batch]
+ exporters: [logging]
+ metrics:
+ receivers: [otlp, prometheus]
+ processors: []
+ exporters: [logging]
+ logs:
+ receivers: [otlp]
+ processors: [batch]
+ exporters: [logging]
\ No newline at end of file
diff --git a/infra/charts/feast-feature-server/samples/otel-sm.yaml b/infra/charts/feast-feature-server/samples/otel-sm.yaml
new file mode 100644
index 0000000000..88cb6a6b41
--- /dev/null
+++ b/infra/charts/feast-feature-server/samples/otel-sm.yaml
@@ -0,0 +1,16 @@
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ labels:
+ app: feast
+ name: otel-sm-1
+spec:
+ endpoints:
+ - port: metrics
+ namespaceSelector:
+ matchNames:
+ - # helm value - {{ .Release.Namespace }}
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: opentelemetry-collector
+ app.kubernetes.io/managed-by: opentelemetry-operator
\ No newline at end of file
diff --git a/infra/charts/feast-feature-server/samples/prometheus.yaml b/infra/charts/feast-feature-server/samples/prometheus.yaml
new file mode 100644
index 0000000000..d960fadd1e
--- /dev/null
+++ b/infra/charts/feast-feature-server/samples/prometheus.yaml
@@ -0,0 +1,15 @@
+kind: Prometheus
+metadata:
+ name: prometheus
+spec:
+ evaluationInterval: 30s
+ podMonitorSelector:
+ matchLabels:
+ app: feast
+ portName: web
+ replicas: 1
+ scrapeInterval: 30s
+ serviceAccountName: prometheus-k8s
+ serviceMonitorSelector:
+ matchLabels:
+ app: feast
\ No newline at end of file
diff --git a/infra/charts/feast-feature-server/samples/rbac.yaml b/infra/charts/feast-feature-server/samples/rbac.yaml
new file mode 100644
index 0000000000..195777d5fa
--- /dev/null
+++ b/infra/charts/feast-feature-server/samples/rbac.yaml
@@ -0,0 +1,68 @@
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: opentelemetry-targetallocator-sa
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+ name: opentelemetry-targetallocator-role-1
+ annotations:
+ meta.helm.sh/release-name: "feast-release"
+ meta.helm.sh/release-namespace: "feast-val"
+ labels:
+ app.kubernetes.io/managed-by: "Helm"
+rules:
+- apiGroups:
+ - monitoring.coreos.com
+ resources:
+ - servicemonitors
+ - podmonitors
+ verbs:
+ - '*'
+- apiGroups: [""]
+ resources:
+ - namespaces
+ verbs: ["get", "list", "watch"]
+- apiGroups: [""]
+ resources:
+ - nodes
+ - nodes/metrics
+ - services
+ - endpoints
+ - pods
+ verbs: ["get", "list", "watch"]
+- apiGroups: [""]
+ resources:
+ - configmaps
+ verbs: ["get"]
+- apiGroups:
+ - discovery.k8s.io
+ resources:
+ - endpointslices
+ verbs: ["get", "list", "watch"]
+- apiGroups:
+ - networking.k8s.io
+ resources:
+ - ingresses
+ verbs: ["get", "list", "watch"]
+- nonResourceURLs: ["/metrics"]
+ verbs: ["get"]
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+ name: opentelemetry-targetallocator-rb-1
+ annotations:
+ meta.helm.sh/release-name: "feast-release"
+ meta.helm.sh/release-namespace: "feast-val"
+ labels:
+ app.kubernetes.io/managed-by: "Helm"
+subjects:
+ - kind: ServiceAccount
+ name: opentelemetry-targetallocator-sa
+ namespace: # helm value - {{ .Release.Namespace }}
+roleRef:
+ kind: ClusterRole
+ name: opentelemetry-targetallocator-role-1
+ apiGroup: rbac.authorization.k8s.io
\ No newline at end of file
diff --git a/infra/charts/feast-feature-server/samples/service-monitor.yaml b/infra/charts/feast-feature-server/samples/service-monitor.yaml
new file mode 100644
index 0000000000..b120bde6d5
--- /dev/null
+++ b/infra/charts/feast-feature-server/samples/service-monitor.yaml
@@ -0,0 +1,16 @@
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ labels:
+ app: feast
+ name: otel-sm
+spec:
+ endpoints:
+ - port: metrics
+ namespaceSelector:
+ matchNames:
+ - # helm value - {{ .Release.Namespace }}
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: opentelemetry-collector
+ app.kubernetes.io/managed-by: opentelemetry-operator
\ No newline at end of file
diff --git a/infra/charts/feast-feature-server/samples/workflow.png b/infra/charts/feast-feature-server/samples/workflow.png
new file mode 100644
index 0000000000..18bc6e959e
Binary files /dev/null and b/infra/charts/feast-feature-server/samples/workflow.png differ
diff --git a/infra/charts/feast-feature-server/templates/deployment.yaml b/infra/charts/feast-feature-server/templates/deployment.yaml
index 85b323610d..a550433db5 100644
--- a/infra/charts/feast-feature-server/templates/deployment.yaml
+++ b/infra/charts/feast-feature-server/templates/deployment.yaml
@@ -14,6 +14,9 @@ spec:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
+ {{- if .Values.metrics.enabled }}
+ instrumentation.opentelemetry.io/inject-python: "true"
+ {{- end }}
{{- end }}
labels:
{{- include "feast-feature-server.selectorLabels" . | nindent 8 }}
@@ -48,10 +51,18 @@ spec:
- "feast"
- "serve_registry"
{{- else }}
+ {{- if .Values.metrics.enlabled }}
- "feast"
- "serve"
+ - "--metrics"
- "-h"
- "0.0.0.0"
+ {{- else }}
+ - "feast"
+ - "serve"
+ - "-h"
+ - "0.0.0.0"
+ {{- end }}
{{- end }}
ports:
- name: {{ .Values.feast_mode }}
@@ -88,4 +99,4 @@ spec:
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
- {{- end }}
+ {{- end }}
\ No newline at end of file
diff --git a/infra/charts/feast-feature-server/templates/service.yaml b/infra/charts/feast-feature-server/templates/service.yaml
index 68f096264e..11f7cc4cf2 100644
--- a/infra/charts/feast-feature-server/templates/service.yaml
+++ b/infra/charts/feast-feature-server/templates/service.yaml
@@ -11,5 +11,11 @@ spec:
targetPort: {{ .Values.feast_mode }}
protocol: TCP
name: http
+ {{- if .Values.metrics.enabled }}
+ - name: metrics
+ port: 8000
+ protocol: TCP
+ targetPort: 8000 # metrics port
+ {{- end }}
selector:
{{- include "feast-feature-server.selectorLabels" . | nindent 4 }}
diff --git a/infra/charts/feast-feature-server/values.yaml b/infra/charts/feast-feature-server/values.yaml
index 0c46bfff85..64d805a66c 100644
--- a/infra/charts/feast-feature-server/values.yaml
+++ b/infra/charts/feast-feature-server/values.yaml
@@ -15,6 +15,12 @@ imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
+metrics:
+ enabled: false
+ otelCollector:
+ endpoint: "" # sample endpoint: "otel-collector.default.svc.cluster.local:4317"
+ port: 4317
+
# feature_store_yaml_base64 -- [required] a base64 encoded version of feature_store.yaml
feature_store_yaml_base64: ""
diff --git a/sdk/python/feast/cli.py b/sdk/python/feast/cli.py
index f0655c40f2..f4e3e97d27 100644
--- a/sdk/python/feast/cli.py
+++ b/sdk/python/feast/cli.py
@@ -684,6 +684,13 @@ def init_command(project_directory, minimal: bool, template: str):
default=5,
show_default=True,
)
+@click.option(
+ "--metrics",
+ "-m",
+ is_flag=True,
+ show_default=True,
+ help="Enable the Metrics Server",
+)
@click.pass_context
def serve_command(
ctx: click.Context,
@@ -692,6 +699,7 @@ def serve_command(
type_: str,
no_access_log: bool,
workers: int,
+ metrics: bool,
keep_alive_timeout: int,
registry_ttl_sec: int = 5,
):
@@ -704,6 +712,7 @@ def serve_command(
type_=type_,
no_access_log=no_access_log,
workers=workers,
+ metrics=metrics,
keep_alive_timeout=keep_alive_timeout,
registry_ttl_sec=registry_ttl_sec,
)
diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py
index bf20e51df9..908c9741c2 100644
--- a/sdk/python/feast/feature_server.py
+++ b/sdk/python/feast/feature_server.py
@@ -1,16 +1,19 @@
import json
import sys
import threading
+import time
import traceback
from contextlib import asynccontextmanager
from typing import List, Optional
import pandas as pd
+import psutil
from dateutil import parser
from fastapi import FastAPI, HTTPException, Request, Response, status
from fastapi.logger import logger
from fastapi.params import Depends
from google.protobuf.json_format import MessageToDict
+from prometheus_client import Gauge, start_http_server
from pydantic import BaseModel
import feast
@@ -19,6 +22,14 @@
from feast.data_source import PushMode
from feast.errors import PushSourceNotFoundException
+# Define prometheus metrics
+cpu_usage_gauge = Gauge(
+ "feast_feature_server_cpu_usage", "CPU usage of the Feast feature server"
+)
+memory_usage_gauge = Gauge(
+ "feast_feature_server_memory_usage", "Memory usage of the Feast feature server"
+)
+
# TODO: deprecate this in favor of push features
class WriteToFeatureStoreRequest(BaseModel):
@@ -218,6 +229,22 @@ def load(self):
return self._app
+def monitor_resources(self, interval: int = 5):
+ """Function to monitor and update CPU and memory usage metrics."""
+ print(f"Start monitor_resources({interval})")
+ p = psutil.Process()
+ print(f"PID is {p.pid}")
+ while True:
+ with p.oneshot():
+ cpu_usage = p.cpu_percent()
+ memory_usage = p.memory_percent()
+ print(f"cpu_usage is {cpu_usage}")
+ print(f"memory_usage is {memory_usage}")
+ cpu_usage_gauge.set(cpu_usage)
+ memory_usage_gauge.set(memory_usage)
+ time.sleep(interval)
+
+
def start_server(
store: "feast.FeatureStore",
host: str,
@@ -226,7 +253,18 @@ def start_server(
workers: int,
keep_alive_timeout: int,
registry_ttl_sec: int,
+ metrics: bool,
):
+ if metrics:
+ print("Start Prometheus Server")
+ start_http_server(8000)
+
+ print("Start a background thread to monitor CPU and memory usage")
+ monitoring_thread = threading.Thread(
+ target=monitor_resources, args=(5,), daemon=True
+ )
+ monitoring_thread.start()
+
if sys.platform != "win32":
FeastServeApplication(
store=store,
diff --git a/sdk/python/feast/feature_store.py b/sdk/python/feast/feature_store.py
index 9600732e17..77638f5a62 100644
--- a/sdk/python/feast/feature_store.py
+++ b/sdk/python/feast/feature_store.py
@@ -1738,6 +1738,7 @@ def serve(
type_: str = "http",
no_access_log: bool = True,
workers: int = 1,
+ metrics: bool = False,
keep_alive_timeout: int = 30,
registry_ttl_sec: int = 2,
) -> None:
@@ -1754,6 +1755,7 @@ def serve(
port=port,
no_access_log=no_access_log,
workers=workers,
+ metrics=metrics,
keep_alive_timeout=keep_alive_timeout,
registry_ttl_sec=registry_ttl_sec,
)
diff --git a/sdk/python/feast/infra/feature_servers/multicloud/Dockerfile b/sdk/python/feast/infra/feature_servers/multicloud/Dockerfile
index c272f4ed66..3114f03f52 100644
--- a/sdk/python/feast/infra/feature_servers/multicloud/Dockerfile
+++ b/sdk/python/feast/infra/feature_servers/multicloud/Dockerfile
@@ -7,7 +7,7 @@ RUN apt update && \
build-essential
RUN pip install pip --upgrade
-RUN pip install "feast[aws,gcp,snowflake,redis,go,mysql,postgres]"
+RUN pip install "feast[aws,gcp,snowflake,redis,go,mysql,postgres,opentelemetry]"
RUN apt update
diff --git a/sdk/python/feast/infra/feature_servers/multicloud/Dockerfile.dev b/sdk/python/feast/infra/feature_servers/multicloud/Dockerfile.dev
index 858a5ae7d1..49e70839a9 100644
--- a/sdk/python/feast/infra/feature_servers/multicloud/Dockerfile.dev
+++ b/sdk/python/feast/infra/feature_servers/multicloud/Dockerfile.dev
@@ -9,7 +9,7 @@ RUN apt update && \
RUN pip install pip --upgrade
COPY . .
-RUN pip install "feast[aws,gcp,snowflake,redis,go,mysql,postgres]"
+RUN pip install "feast[aws,gcp,snowflake,redis,go,mysql,postgres,opentelemetry]"
RUN apt update
RUN apt install -y -V ca-certificates lsb-release wget
diff --git a/sdk/python/requirements/py3.10-ci-requirements.txt b/sdk/python/requirements/py3.10-ci-requirements.txt
index a9f1d625a8..ddf72c59f4 100644
--- a/sdk/python/requirements/py3.10-ci-requirements.txt
+++ b/sdk/python/requirements/py3.10-ci-requirements.txt
@@ -1,6 +1,7 @@
# This file was autogenerated by uv via the following command:
# uv pip compile --system --no-strip-extras setup.py --extra ci --output-file sdk/python/requirements/py3.10-ci-requirements.txt
aiobotocore==2.13.1
+ # via feast (setup.py)
aiohttp==3.9.5
# via aiobotocore
aioitertools==0.11.0
@@ -19,6 +20,8 @@ anyio==4.4.0
# jupyter-server
# starlette
# watchfiles
+appnope==0.1.4
+ # via ipykernel
argon2-cffi==23.1.0
# via jupyter-server
argon2-cffi-bindings==21.2.0
@@ -28,6 +31,7 @@ arrow==1.3.0
asn1crypto==1.5.1
# via snowflake-connector-python
assertpy==1.1
+ # via feast (setup.py)
asttokens==2.4.1
# via stack-data
async-lru==2.0.4
@@ -48,7 +52,9 @@ azure-core==1.30.2
# azure-identity
# azure-storage-blob
azure-identity==1.17.1
+ # via feast (setup.py)
azure-storage-blob==12.20.0
+ # via feast (setup.py)
babel==2.15.0
# via
# jupyterlab-server
@@ -60,7 +66,9 @@ bidict==0.23.1
bleach==6.1.0
# via nbconvert
boto3==1.34.131
- # via moto
+ # via
+ # feast (setup.py)
+ # moto
botocore==1.34.131
# via
# aiobotocore
@@ -69,11 +77,13 @@ botocore==1.34.131
# s3transfer
build==1.2.1
# via
+ # feast (setup.py)
# pip-tools
# singlestoredb
cachetools==5.3.3
# via google-auth
cassandra-driver==3.29.1
+ # via feast (setup.py)
certifi==2024.7.4
# via
# elastic-transport
@@ -96,6 +106,7 @@ charset-normalizer==3.3.2
# snowflake-connector-python
click==8.1.7
# via
+ # feast (setup.py)
# dask
# geomet
# great-expectations
@@ -105,7 +116,9 @@ click==8.1.7
cloudpickle==3.0.0
# via dask
colorama==0.4.6
- # via great-expectations
+ # via
+ # feast (setup.py)
+ # great-expectations
comm==0.2.2
# via
# ipykernel
@@ -114,6 +127,7 @@ coverage[toml]==7.5.4
# via pytest-cov
cryptography==42.0.8
# via
+ # feast (setup.py)
# azure-identity
# azure-storage-blob
# great-expectations
@@ -125,7 +139,9 @@ cryptography==42.0.8
# types-pyopenssl
# types-redis
dask[dataframe]==2024.6.2
- # via dask-expr
+ # via
+ # feast (setup.py)
+ # dask-expr
dask-expr==1.1.6
# via dask
db-dtypes==1.2.0
@@ -137,7 +153,9 @@ decorator==5.1.1
defusedxml==0.7.1
# via nbconvert
deltalake==0.18.1
+ # via feast (setup.py)
dill==0.3.8
+ # via feast (setup.py)
distlib==0.3.8
# via virtualenv
dnspython==2.6.1
@@ -151,6 +169,7 @@ duckdb==0.10.3
elastic-transport==8.13.1
# via elasticsearch
elasticsearch==8.14.0
+ # via feast (setup.py)
email-validator==2.2.0
# via fastapi
entrypoints==0.4
@@ -165,6 +184,7 @@ execnet==2.1.1
executing==2.0.1
# via stack-data
fastapi==0.111.0
+ # via feast (setup.py)
fastapi-cli==0.0.4
# via fastapi
fastjsonschema==2.20.0
@@ -180,13 +200,16 @@ frozenlist==1.4.1
# aiohttp
# aiosignal
fsspec==2023.12.2
- # via dask
+ # via
+ # feast (setup.py)
+ # dask
geojson==2.5.0
# via rockset
geomet==0.2.1.post1
# via cassandra-driver
google-api-core[grpc]==2.19.1
# via
+ # feast (setup.py)
# google-cloud-bigquery
# google-cloud-bigquery-storage
# google-cloud-bigtable
@@ -201,8 +224,11 @@ google-auth==2.30.0
# google-cloud-storage
# kubernetes
google-cloud-bigquery[pandas]==3.13.0
+ # via feast (setup.py)
google-cloud-bigquery-storage==2.25.0
+ # via feast (setup.py)
google-cloud-bigtable==2.24.0
+ # via feast (setup.py)
google-cloud-core==2.4.1
# via
# google-cloud-bigquery
@@ -210,7 +236,9 @@ google-cloud-core==2.4.1
# google-cloud-datastore
# google-cloud-storage
google-cloud-datastore==2.19.0
+ # via feast (setup.py)
google-cloud-storage==2.17.0
+ # via feast (setup.py)
google-crc32c==1.5.0
# via
# google-cloud-storage
@@ -221,16 +249,19 @@ google-resumable-media==2.7.1
# google-cloud-storage
googleapis-common-protos[grpc]==1.63.2
# via
+ # feast (setup.py)
# google-api-core
# grpc-google-iam-v1
# grpcio-status
great-expectations==0.18.16
+ # via feast (setup.py)
greenlet==3.0.3
# via sqlalchemy
grpc-google-iam-v1==0.13.1
# via google-cloud-bigtable
grpcio==1.64.1
# via
+ # feast (setup.py)
# google-api-core
# google-cloud-bigquery
# googleapis-common-protos
@@ -241,30 +272,42 @@ grpcio==1.64.1
# grpcio-testing
# grpcio-tools
grpcio-health-checking==1.62.2
+ # via feast (setup.py)
grpcio-reflection==1.62.2
+ # via feast (setup.py)
grpcio-status==1.62.2
# via google-api-core
grpcio-testing==1.62.2
+ # via feast (setup.py)
grpcio-tools==1.62.2
+ # via feast (setup.py)
gunicorn==22.0.0
+ # via feast (setup.py)
h11==0.14.0
# via
# httpcore
# uvicorn
happybase==1.2.0
+ # via feast (setup.py)
hazelcast-python-client==5.4.0
+ # via feast (setup.py)
hiredis==2.3.2
+ # via feast (setup.py)
httpcore==1.0.5
# via httpx
httptools==0.6.1
# via uvicorn
httpx==0.27.0
# via
+ # feast (setup.py)
# fastapi
# jupyterlab
ibis-framework[duckdb]==9.1.0
- # via ibis-substrait
+ # via
+ # feast (setup.py)
+ # ibis-substrait
ibis-substrait==4.0.0
+ # via feast (setup.py)
identify==2.5.36
# via pre-commit
idna==3.7
@@ -299,6 +342,7 @@ jedi==0.19.1
# via ipython
jinja2==3.1.4
# via
+ # feast (setup.py)
# altair
# fastapi
# great-expectations
@@ -322,6 +366,7 @@ jsonpointer==3.0.0
# jsonschema
jsonschema[format-nongpl]==4.22.0
# via
+ # feast (setup.py)
# altair
# great-expectations
# jupyter-events
@@ -367,6 +412,7 @@ jupyterlab-server==2.27.2
jupyterlab-widgets==3.0.11
# via ipywidgets
kubernetes==20.13.0
+ # via feast (setup.py)
locket==1.0.0
# via partd
makefun==1.15.2
@@ -387,13 +433,17 @@ matplotlib-inline==0.1.7
mdurl==0.1.2
# via markdown-it-py
minio==7.1.0
+ # via feast (setup.py)
mistune==3.0.2
# via
# great-expectations
# nbconvert
mmh3==4.1.0
+ # via feast (setup.py)
mock==2.0.0
+ # via feast (setup.py)
moto==4.2.14
+ # via feast (setup.py)
msal==1.29.0
# via
# azure-identity
@@ -405,10 +455,13 @@ multidict==6.0.5
# aiohttp
# yarl
mypy==1.10.1
- # via sqlalchemy
+ # via
+ # feast (setup.py)
+ # sqlalchemy
mypy-extensions==1.0.0
# via mypy
mypy-protobuf==3.3.0
+ # via feast (setup.py)
nbclient==0.10.0
# via nbconvert
nbconvert==7.16.4
@@ -431,6 +484,7 @@ notebook-shim==0.2.4
# notebook
numpy==1.26.4
# via
+ # feast (setup.py)
# altair
# dask
# db-dtypes
@@ -465,6 +519,7 @@ packaging==24.1
# sphinx
pandas==2.2.2
# via
+ # feast (setup.py)
# altair
# dask
# dask-expr
@@ -490,6 +545,7 @@ pexpect==4.9.0
pip==24.1.1
# via pip-tools
pip-tools==7.4.1
+ # via feast (setup.py)
platformdirs==3.11.0
# via
# jupyter-core
@@ -502,8 +558,11 @@ ply==3.11
portalocker==2.10.0
# via msal-extensions
pre-commit==3.3.1
+ # via feast (setup.py)
prometheus-client==0.20.0
- # via jupyter-server
+ # via
+ # feast (setup.py)
+ # jupyter-server
prompt-toolkit==3.0.47
# via ipython
proto-plus==1.24.0
@@ -515,6 +574,7 @@ proto-plus==1.24.0
# google-cloud-datastore
protobuf==4.25.3
# via
+ # feast (setup.py)
# google-api-core
# google-cloud-bigquery
# google-cloud-bigquery-storage
@@ -531,8 +591,11 @@ protobuf==4.25.3
# proto-plus
# substrait
psutil==5.9.0
- # via ipykernel
+ # via
+ # feast (setup.py)
+ # ipykernel
psycopg[binary, pool]==3.1.19
+ # via feast (setup.py)
psycopg-binary==3.1.19
# via psycopg
psycopg-pool==3.2.2
@@ -544,12 +607,14 @@ ptyprocess==0.7.0
pure-eval==0.2.2
# via stack-data
py==1.11.0
+ # via feast (setup.py)
py-cpuinfo==9.0.0
# via pytest-benchmark
py4j==0.10.9.7
# via pyspark
pyarrow==15.0.2
# via
+ # feast (setup.py)
# dask-expr
# db-dtypes
# deltalake
@@ -567,16 +632,19 @@ pyasn1==0.6.0
pyasn1-modules==0.4.0
# via google-auth
pybindgen==0.22.1
+ # via feast (setup.py)
pycparser==2.22
# via cffi
pydantic==2.7.4
# via
+ # feast (setup.py)
# fastapi
# great-expectations
pydantic-core==2.18.4
# via pydantic
pygments==2.18.0
# via
+ # feast (setup.py)
# ipython
# nbconvert
# rich
@@ -587,8 +655,11 @@ pyjwt[crypto]==2.8.0
# singlestoredb
# snowflake-connector-python
pymssql==2.3.0
+ # via feast (setup.py)
pymysql==1.1.1
+ # via feast (setup.py)
pyodbc==5.1.0
+ # via feast (setup.py)
pyopenssl==24.1.0
# via snowflake-connector-python
pyparsing==3.1.2
@@ -598,8 +669,10 @@ pyproject-hooks==1.1.0
# build
# pip-tools
pyspark==3.5.1
+ # via feast (setup.py)
pytest==7.4.4
# via
+ # feast (setup.py)
# pytest-benchmark
# pytest-cov
# pytest-env
@@ -609,13 +682,21 @@ pytest==7.4.4
# pytest-timeout
# pytest-xdist
pytest-benchmark==3.4.1
+ # via feast (setup.py)
pytest-cov==5.0.0
+ # via feast (setup.py)
pytest-env==1.1.3
+ # via feast (setup.py)
pytest-lazy-fixture==0.6.3
+ # via feast (setup.py)
pytest-mock==1.10.4
+ # via feast (setup.py)
pytest-ordering==0.6
+ # via feast (setup.py)
pytest-timeout==1.4.2
+ # via feast (setup.py)
pytest-xdist==3.6.1
+ # via feast (setup.py)
python-dateutil==2.9.0.post0
# via
# arrow
@@ -644,6 +725,7 @@ pytz==2024.1
# trino
pyyaml==6.0.1
# via
+ # feast (setup.py)
# dask
# ibis-substrait
# jupyter-events
@@ -657,15 +739,19 @@ pyzmq==26.0.3
# jupyter-client
# jupyter-server
redis==4.6.0
+ # via feast (setup.py)
referencing==0.35.1
# via
# jsonschema
# jsonschema-specifications
# jupyter-events
regex==2024.5.15
- # via parsimonious
+ # via
+ # feast (setup.py)
+ # parsimonious
requests==2.32.3
# via
+ # feast (setup.py)
# azure-core
# docker
# google-api-core
@@ -699,6 +785,7 @@ rich==13.7.1
# ibis-framework
# typer
rockset==2.1.2
+ # via feast (setup.py)
rpds-py==0.18.1
# via
# jsonschema
@@ -708,6 +795,7 @@ rsa==4.9
ruamel-yaml==0.17.17
# via great-expectations
ruff==0.4.10
+ # via feast (setup.py)
s3transfer==0.10.2
# via boto3
scipy==1.14.0
@@ -724,6 +812,7 @@ setuptools==70.1.1
shellingham==1.5.4
# via typer
singlestoredb==1.4.0
+ # via feast (setup.py)
six==1.16.0
# via
# asttokens
@@ -744,11 +833,13 @@ sniffio==1.3.1
snowballstemmer==2.2.0
# via sphinx
snowflake-connector-python[pandas]==3.11.0
+ # via feast (setup.py)
sortedcontainers==2.4.0
# via snowflake-connector-python
soupsieve==2.5
# via beautifulsoup4
sphinx==6.2.1
+ # via feast (setup.py)
sphinxcontrib-applehelp==1.0.8
# via sphinx
sphinxcontrib-devhelp==1.0.6
@@ -762,9 +853,11 @@ sphinxcontrib-qthelp==1.0.7
sphinxcontrib-serializinghtml==1.1.10
# via sphinx
sqlalchemy[mypy]==2.0.31
+ # via feast (setup.py)
sqlglot==25.1.0
# via ibis-framework
sqlite-vec==0.0.1a10
+ # via feast (setup.py)
sqlparams==6.0.1
# via singlestoredb
stack-data==0.6.3
@@ -774,17 +867,21 @@ starlette==0.37.2
substrait==0.19.0
# via ibis-substrait
tabulate==0.9.0
+ # via feast (setup.py)
tenacity==8.4.2
+ # via feast (setup.py)
terminado==0.18.1
# via
# jupyter-server
# jupyter-server-terminals
testcontainers==4.4.0
+ # via feast (setup.py)
thriftpy2==0.5.1
# via happybase
tinycss2==1.3.0
# via nbconvert
toml==0.10.2
+ # via feast (setup.py)
tomli==2.0.1
# via
# build
@@ -812,7 +909,9 @@ tornado==6.4.1
# notebook
# terminado
tqdm==4.66.4
- # via great-expectations
+ # via
+ # feast (setup.py)
+ # great-expectations
traitlets==5.14.3
# via
# comm
@@ -829,25 +928,39 @@ traitlets==5.14.3
# nbconvert
# nbformat
trino==0.328.0
+ # via feast (setup.py)
typeguard==4.3.0
+ # via feast (setup.py)
typer==0.12.3
# via fastapi-cli
types-cffi==1.16.0.20240331
# via types-pyopenssl
types-protobuf==3.19.22
- # via mypy-protobuf
+ # via
+ # feast (setup.py)
+ # mypy-protobuf
types-pymysql==1.1.0.20240524
+ # via feast (setup.py)
types-pyopenssl==24.1.0.20240425
# via types-redis
types-python-dateutil==2.9.0.20240316
- # via arrow
+ # via
+ # feast (setup.py)
+ # arrow
types-pytz==2024.1.0.20240417
+ # via feast (setup.py)
types-pyyaml==6.0.12.20240311
+ # via feast (setup.py)
types-redis==4.6.0.20240425
+ # via feast (setup.py)
types-requests==2.30.0.0
+ # via feast (setup.py)
types-setuptools==70.1.0.20240627
- # via types-cffi
+ # via
+ # feast (setup.py)
+ # types-cffi
types-tabulate==0.9.0.20240106
+ # via feast (setup.py)
types-urllib3==1.26.25.14
# via types-requests
typing-extensions==4.12.2
@@ -884,6 +997,7 @@ uri-template==1.3.0
# via jsonschema
urllib3==1.26.19
# via
+ # feast (setup.py)
# botocore
# docker
# elastic-transport
@@ -895,11 +1009,15 @@ urllib3==1.26.19
# rockset
# testcontainers
uvicorn[standard]==0.30.1
- # via fastapi
+ # via
+ # feast (setup.py)
+ # fastapi
uvloop==0.19.0
# via uvicorn
virtualenv==20.23.0
- # via pre-commit
+ # via
+ # feast (setup.py)
+ # pre-commit
watchfiles==0.22.0
# via uvicorn
wcwidth==0.2.13
diff --git a/sdk/python/requirements/py3.10-requirements.txt b/sdk/python/requirements/py3.10-requirements.txt
index 0cca106863..93322ae434 100644
--- a/sdk/python/requirements/py3.10-requirements.txt
+++ b/sdk/python/requirements/py3.10-requirements.txt
@@ -20,17 +20,22 @@ charset-normalizer==3.3.2
# via requests
click==8.1.7
# via
+ # feast (setup.py)
# dask
# typer
# uvicorn
cloudpickle==3.0.0
# via dask
colorama==0.4.6
+ # via feast (setup.py)
dask[dataframe]==2024.5.0
- # via dask-expr
+ # via
+ # feast (setup.py)
+ # dask-expr
dask-expr==1.1.0
# via dask
dill==0.3.8
+ # via feast (setup.py)
dnspython==2.6.1
# via email-validator
email-validator==2.1.1
@@ -38,7 +43,9 @@ email-validator==2.1.1
exceptiongroup==1.2.1
# via anyio
fastapi==0.111.0
- # via fastapi-cli
+ # via
+ # feast (setup.py)
+ # fastapi-cli
fastapi-cli==0.0.2
# via fastapi
fsspec==2024.3.1
@@ -46,6 +53,7 @@ fsspec==2024.3.1
greenlet==3.0.3
# via sqlalchemy
gunicorn==22.0.0
+ # via feast (setup.py)
h11==0.14.0
# via
# httpcore
@@ -65,8 +73,11 @@ idna==3.7
importlib-metadata==7.1.0
# via dask
jinja2==3.1.4
- # via fastapi
+ # via
+ # feast (setup.py)
+ # fastapi
jsonschema==4.22.0
+ # via feast (setup.py)
jsonschema-specifications==2023.12.1
# via jsonschema
locket==1.0.0
@@ -78,13 +89,16 @@ markupsafe==2.1.5
mdurl==0.1.2
# via markdown-it-py
mmh3==4.1.0
+ # via feast (setup.py)
mypy==1.10.0
# via sqlalchemy
mypy-extensions==1.0.0
# via mypy
mypy-protobuf==3.6.0
+ # via feast (setup.py)
numpy==1.26.4
# via
+ # feast (setup.py)
# dask
# pandas
# pyarrow
@@ -96,20 +110,33 @@ packaging==24.0
# gunicorn
pandas==2.2.2
# via
+ # feast (setup.py)
# dask
# dask-expr
partd==1.4.2
# via dask
+prometheus-client==0.20.0
+ # via feast (setup.py)
protobuf==4.25.3
- # via mypy-protobuf
+ # via
+ # feast (setup.py)
+ # mypy-protobuf
+psutil==6.0.0
+ # via feast (setup.py)
pyarrow==16.0.0
- # via dask-expr
+ # via
+ # feast (setup.py)
+ # dask-expr
pydantic==2.7.1
- # via fastapi
+ # via
+ # feast (setup.py)
+ # fastapi
pydantic-core==2.18.2
# via pydantic
pygments==2.18.0
- # via rich
+ # via
+ # feast (setup.py)
+ # rich
python-dateutil==2.9.0.post0
# via pandas
python-dotenv==1.0.1
@@ -120,6 +147,7 @@ pytz==2024.1
# via pandas
pyyaml==6.0.1
# via
+ # feast (setup.py)
# dask
# uvicorn
referencing==0.35.1
@@ -127,6 +155,7 @@ referencing==0.35.1
# jsonschema
# jsonschema-specifications
requests==2.31.0
+ # via feast (setup.py)
rich==13.7.1
# via typer
rpds-py==0.18.1
@@ -142,11 +171,15 @@ sniffio==1.3.1
# anyio
# httpx
sqlalchemy[mypy]==2.0.30
+ # via feast (setup.py)
starlette==0.37.2
# via fastapi
tabulate==0.9.0
+ # via feast (setup.py)
tenacity==8.3.0
+ # via feast (setup.py)
toml==0.10.2
+ # via feast (setup.py)
tomli==2.0.1
# via mypy
toolz==0.12.1
@@ -154,7 +187,9 @@ toolz==0.12.1
# dask
# partd
tqdm==4.66.4
+ # via feast (setup.py)
typeguard==4.2.1
+ # via feast (setup.py)
typer==0.12.3
# via fastapi-cli
types-protobuf==5.26.0.20240422
@@ -178,6 +213,7 @@ urllib3==2.2.1
# via requests
uvicorn[standard]==0.29.0
# via
+ # feast (setup.py)
# fastapi
# fastapi-cli
uvloop==0.19.0
diff --git a/sdk/python/requirements/py3.11-ci-requirements.txt b/sdk/python/requirements/py3.11-ci-requirements.txt
index ce2e50b8a7..a451ad58af 100644
--- a/sdk/python/requirements/py3.11-ci-requirements.txt
+++ b/sdk/python/requirements/py3.11-ci-requirements.txt
@@ -1,6 +1,7 @@
# This file was autogenerated by uv via the following command:
# uv pip compile --system --no-strip-extras setup.py --extra ci --output-file sdk/python/requirements/py3.11-ci-requirements.txt
aiobotocore==2.13.1
+ # via feast (setup.py)
aiohttp==3.9.5
# via aiobotocore
aioitertools==0.11.0
@@ -19,6 +20,8 @@ anyio==4.4.0
# jupyter-server
# starlette
# watchfiles
+appnope==0.1.4
+ # via ipykernel
argon2-cffi==23.1.0
# via jupyter-server
argon2-cffi-bindings==21.2.0
@@ -28,6 +31,7 @@ arrow==1.3.0
asn1crypto==1.5.1
# via snowflake-connector-python
assertpy==1.1
+ # via feast (setup.py)
asttokens==2.4.1
# via stack-data
async-lru==2.0.4
@@ -44,7 +48,9 @@ azure-core==1.30.2
# azure-identity
# azure-storage-blob
azure-identity==1.17.1
+ # via feast (setup.py)
azure-storage-blob==12.20.0
+ # via feast (setup.py)
babel==2.15.0
# via
# jupyterlab-server
@@ -56,7 +62,9 @@ bidict==0.23.1
bleach==6.1.0
# via nbconvert
boto3==1.34.131
- # via moto
+ # via
+ # feast (setup.py)
+ # moto
botocore==1.34.131
# via
# aiobotocore
@@ -65,11 +73,13 @@ botocore==1.34.131
# s3transfer
build==1.2.1
# via
+ # feast (setup.py)
# pip-tools
# singlestoredb
cachetools==5.3.3
# via google-auth
cassandra-driver==3.29.1
+ # via feast (setup.py)
certifi==2024.7.4
# via
# elastic-transport
@@ -92,6 +102,7 @@ charset-normalizer==3.3.2
# snowflake-connector-python
click==8.1.7
# via
+ # feast (setup.py)
# dask
# geomet
# great-expectations
@@ -101,7 +112,9 @@ click==8.1.7
cloudpickle==3.0.0
# via dask
colorama==0.4.6
- # via great-expectations
+ # via
+ # feast (setup.py)
+ # great-expectations
comm==0.2.2
# via
# ipykernel
@@ -110,6 +123,7 @@ coverage[toml]==7.5.4
# via pytest-cov
cryptography==42.0.8
# via
+ # feast (setup.py)
# azure-identity
# azure-storage-blob
# great-expectations
@@ -121,7 +135,9 @@ cryptography==42.0.8
# types-pyopenssl
# types-redis
dask[dataframe]==2024.6.2
- # via dask-expr
+ # via
+ # feast (setup.py)
+ # dask-expr
dask-expr==1.1.6
# via dask
db-dtypes==1.2.0
@@ -133,7 +149,9 @@ decorator==5.1.1
defusedxml==0.7.1
# via nbconvert
deltalake==0.18.1
+ # via feast (setup.py)
dill==0.3.8
+ # via feast (setup.py)
distlib==0.3.8
# via virtualenv
dnspython==2.6.1
@@ -147,6 +165,7 @@ duckdb==0.10.3
elastic-transport==8.13.1
# via elasticsearch
elasticsearch==8.14.0
+ # via feast (setup.py)
email-validator==2.2.0
# via fastapi
entrypoints==0.4
@@ -156,6 +175,7 @@ execnet==2.1.1
executing==2.0.1
# via stack-data
fastapi==0.111.0
+ # via feast (setup.py)
fastapi-cli==0.0.4
# via fastapi
fastjsonschema==2.20.0
@@ -171,13 +191,16 @@ frozenlist==1.4.1
# aiohttp
# aiosignal
fsspec==2023.12.2
- # via dask
+ # via
+ # feast (setup.py)
+ # dask
geojson==2.5.0
# via rockset
geomet==0.2.1.post1
# via cassandra-driver
google-api-core[grpc]==2.19.1
# via
+ # feast (setup.py)
# google-cloud-bigquery
# google-cloud-bigquery-storage
# google-cloud-bigtable
@@ -192,8 +215,11 @@ google-auth==2.30.0
# google-cloud-storage
# kubernetes
google-cloud-bigquery[pandas]==3.13.0
+ # via feast (setup.py)
google-cloud-bigquery-storage==2.25.0
+ # via feast (setup.py)
google-cloud-bigtable==2.24.0
+ # via feast (setup.py)
google-cloud-core==2.4.1
# via
# google-cloud-bigquery
@@ -201,7 +227,9 @@ google-cloud-core==2.4.1
# google-cloud-datastore
# google-cloud-storage
google-cloud-datastore==2.19.0
+ # via feast (setup.py)
google-cloud-storage==2.17.0
+ # via feast (setup.py)
google-crc32c==1.5.0
# via
# google-cloud-storage
@@ -212,16 +240,19 @@ google-resumable-media==2.7.1
# google-cloud-storage
googleapis-common-protos[grpc]==1.63.2
# via
+ # feast (setup.py)
# google-api-core
# grpc-google-iam-v1
# grpcio-status
great-expectations==0.18.16
+ # via feast (setup.py)
greenlet==3.0.3
# via sqlalchemy
grpc-google-iam-v1==0.13.1
# via google-cloud-bigtable
grpcio==1.64.1
# via
+ # feast (setup.py)
# google-api-core
# google-cloud-bigquery
# googleapis-common-protos
@@ -232,30 +263,42 @@ grpcio==1.64.1
# grpcio-testing
# grpcio-tools
grpcio-health-checking==1.62.2
+ # via feast (setup.py)
grpcio-reflection==1.62.2
+ # via feast (setup.py)
grpcio-status==1.62.2
# via google-api-core
grpcio-testing==1.62.2
+ # via feast (setup.py)
grpcio-tools==1.62.2
+ # via feast (setup.py)
gunicorn==22.0.0
+ # via feast (setup.py)
h11==0.14.0
# via
# httpcore
# uvicorn
happybase==1.2.0
+ # via feast (setup.py)
hazelcast-python-client==5.4.0
+ # via feast (setup.py)
hiredis==2.3.2
+ # via feast (setup.py)
httpcore==1.0.5
# via httpx
httptools==0.6.1
# via uvicorn
httpx==0.27.0
# via
+ # feast (setup.py)
# fastapi
# jupyterlab
ibis-framework[duckdb]==9.1.0
- # via ibis-substrait
+ # via
+ # feast (setup.py)
+ # ibis-substrait
ibis-substrait==4.0.0
+ # via feast (setup.py)
identify==2.5.36
# via pre-commit
idna==3.7
@@ -290,6 +333,7 @@ jedi==0.19.1
# via ipython
jinja2==3.1.4
# via
+ # feast (setup.py)
# altair
# fastapi
# great-expectations
@@ -313,6 +357,7 @@ jsonpointer==3.0.0
# jsonschema
jsonschema[format-nongpl]==4.22.0
# via
+ # feast (setup.py)
# altair
# great-expectations
# jupyter-events
@@ -358,6 +403,7 @@ jupyterlab-server==2.27.2
jupyterlab-widgets==3.0.11
# via ipywidgets
kubernetes==20.13.0
+ # via feast (setup.py)
locket==1.0.0
# via partd
makefun==1.15.2
@@ -378,13 +424,17 @@ matplotlib-inline==0.1.7
mdurl==0.1.2
# via markdown-it-py
minio==7.1.0
+ # via feast (setup.py)
mistune==3.0.2
# via
# great-expectations
# nbconvert
mmh3==4.1.0
+ # via feast (setup.py)
mock==2.0.0
+ # via feast (setup.py)
moto==4.2.14
+ # via feast (setup.py)
msal==1.29.0
# via
# azure-identity
@@ -396,10 +446,13 @@ multidict==6.0.5
# aiohttp
# yarl
mypy==1.10.1
- # via sqlalchemy
+ # via
+ # feast (setup.py)
+ # sqlalchemy
mypy-extensions==1.0.0
# via mypy
mypy-protobuf==3.3.0
+ # via feast (setup.py)
nbclient==0.10.0
# via nbconvert
nbconvert==7.16.4
@@ -422,6 +475,7 @@ notebook-shim==0.2.4
# notebook
numpy==1.26.4
# via
+ # feast (setup.py)
# altair
# dask
# db-dtypes
@@ -456,6 +510,7 @@ packaging==24.1
# sphinx
pandas==2.2.2
# via
+ # feast (setup.py)
# altair
# dask
# dask-expr
@@ -481,6 +536,7 @@ pexpect==4.9.0
pip==24.1.1
# via pip-tools
pip-tools==7.4.1
+ # via feast (setup.py)
platformdirs==3.11.0
# via
# jupyter-core
@@ -493,8 +549,11 @@ ply==3.11
portalocker==2.10.0
# via msal-extensions
pre-commit==3.3.1
+ # via feast (setup.py)
prometheus-client==0.20.0
- # via jupyter-server
+ # via
+ # feast (setup.py)
+ # jupyter-server
prompt-toolkit==3.0.47
# via ipython
proto-plus==1.24.0
@@ -506,6 +565,7 @@ proto-plus==1.24.0
# google-cloud-datastore
protobuf==4.25.3
# via
+ # feast (setup.py)
# google-api-core
# google-cloud-bigquery
# google-cloud-bigquery-storage
@@ -522,8 +582,11 @@ protobuf==4.25.3
# proto-plus
# substrait
psutil==5.9.0
- # via ipykernel
+ # via
+ # feast (setup.py)
+ # ipykernel
psycopg[binary, pool]==3.1.19
+ # via feast (setup.py)
psycopg-binary==3.1.19
# via psycopg
psycopg-pool==3.2.2
@@ -535,12 +598,14 @@ ptyprocess==0.7.0
pure-eval==0.2.2
# via stack-data
py==1.11.0
+ # via feast (setup.py)
py-cpuinfo==9.0.0
# via pytest-benchmark
py4j==0.10.9.7
# via pyspark
pyarrow==15.0.2
# via
+ # feast (setup.py)
# dask-expr
# db-dtypes
# deltalake
@@ -558,16 +623,19 @@ pyasn1==0.6.0
pyasn1-modules==0.4.0
# via google-auth
pybindgen==0.22.1
+ # via feast (setup.py)
pycparser==2.22
# via cffi
pydantic==2.7.4
# via
+ # feast (setup.py)
# fastapi
# great-expectations
pydantic-core==2.18.4
# via pydantic
pygments==2.18.0
# via
+ # feast (setup.py)
# ipython
# nbconvert
# rich
@@ -578,8 +646,11 @@ pyjwt[crypto]==2.8.0
# singlestoredb
# snowflake-connector-python
pymssql==2.3.0
+ # via feast (setup.py)
pymysql==1.1.1
+ # via feast (setup.py)
pyodbc==5.1.0
+ # via feast (setup.py)
pyopenssl==24.1.0
# via snowflake-connector-python
pyparsing==3.1.2
@@ -589,8 +660,10 @@ pyproject-hooks==1.1.0
# build
# pip-tools
pyspark==3.5.1
+ # via feast (setup.py)
pytest==7.4.4
# via
+ # feast (setup.py)
# pytest-benchmark
# pytest-cov
# pytest-env
@@ -600,13 +673,21 @@ pytest==7.4.4
# pytest-timeout
# pytest-xdist
pytest-benchmark==3.4.1
+ # via feast (setup.py)
pytest-cov==5.0.0
+ # via feast (setup.py)
pytest-env==1.1.3
+ # via feast (setup.py)
pytest-lazy-fixture==0.6.3
+ # via feast (setup.py)
pytest-mock==1.10.4
+ # via feast (setup.py)
pytest-ordering==0.6
+ # via feast (setup.py)
pytest-timeout==1.4.2
+ # via feast (setup.py)
pytest-xdist==3.6.1
+ # via feast (setup.py)
python-dateutil==2.9.0.post0
# via
# arrow
@@ -635,6 +716,7 @@ pytz==2024.1
# trino
pyyaml==6.0.1
# via
+ # feast (setup.py)
# dask
# ibis-substrait
# jupyter-events
@@ -648,15 +730,19 @@ pyzmq==26.0.3
# jupyter-client
# jupyter-server
redis==4.6.0
+ # via feast (setup.py)
referencing==0.35.1
# via
# jsonschema
# jsonschema-specifications
# jupyter-events
regex==2024.5.15
- # via parsimonious
+ # via
+ # feast (setup.py)
+ # parsimonious
requests==2.32.3
# via
+ # feast (setup.py)
# azure-core
# docker
# google-api-core
@@ -690,6 +776,7 @@ rich==13.7.1
# ibis-framework
# typer
rockset==2.1.2
+ # via feast (setup.py)
rpds-py==0.18.1
# via
# jsonschema
@@ -699,6 +786,7 @@ rsa==4.9
ruamel-yaml==0.17.17
# via great-expectations
ruff==0.4.10
+ # via feast (setup.py)
s3transfer==0.10.2
# via boto3
scipy==1.14.0
@@ -715,6 +803,7 @@ setuptools==70.1.1
shellingham==1.5.4
# via typer
singlestoredb==1.4.0
+ # via feast (setup.py)
six==1.16.0
# via
# asttokens
@@ -735,11 +824,13 @@ sniffio==1.3.1
snowballstemmer==2.2.0
# via sphinx
snowflake-connector-python[pandas]==3.11.0
+ # via feast (setup.py)
sortedcontainers==2.4.0
# via snowflake-connector-python
soupsieve==2.5
# via beautifulsoup4
sphinx==6.2.1
+ # via feast (setup.py)
sphinxcontrib-applehelp==1.0.8
# via sphinx
sphinxcontrib-devhelp==1.0.6
@@ -753,9 +844,11 @@ sphinxcontrib-qthelp==1.0.7
sphinxcontrib-serializinghtml==1.1.10
# via sphinx
sqlalchemy[mypy]==2.0.31
+ # via feast (setup.py)
sqlglot==25.1.0
# via ibis-framework
sqlite-vec==0.0.1a10
+ # via feast (setup.py)
sqlparams==6.0.1
# via singlestoredb
stack-data==0.6.3
@@ -765,17 +858,21 @@ starlette==0.37.2
substrait==0.19.0
# via ibis-substrait
tabulate==0.9.0
+ # via feast (setup.py)
tenacity==8.4.2
+ # via feast (setup.py)
terminado==0.18.1
# via
# jupyter-server
# jupyter-server-terminals
testcontainers==4.4.0
+ # via feast (setup.py)
thriftpy2==0.5.1
# via happybase
tinycss2==1.3.0
# via nbconvert
toml==0.10.2
+ # via feast (setup.py)
tomlkit==0.12.5
# via snowflake-connector-python
toolz==0.12.1
@@ -793,7 +890,9 @@ tornado==6.4.1
# notebook
# terminado
tqdm==4.66.4
- # via great-expectations
+ # via
+ # feast (setup.py)
+ # great-expectations
traitlets==5.14.3
# via
# comm
@@ -810,25 +909,39 @@ traitlets==5.14.3
# nbconvert
# nbformat
trino==0.328.0
+ # via feast (setup.py)
typeguard==4.3.0
+ # via feast (setup.py)
typer==0.12.3
# via fastapi-cli
types-cffi==1.16.0.20240331
# via types-pyopenssl
types-protobuf==3.19.22
- # via mypy-protobuf
+ # via
+ # feast (setup.py)
+ # mypy-protobuf
types-pymysql==1.1.0.20240524
+ # via feast (setup.py)
types-pyopenssl==24.1.0.20240425
# via types-redis
types-python-dateutil==2.9.0.20240316
- # via arrow
+ # via
+ # feast (setup.py)
+ # arrow
types-pytz==2024.1.0.20240417
+ # via feast (setup.py)
types-pyyaml==6.0.12.20240311
+ # via feast (setup.py)
types-redis==4.6.0.20240425
+ # via feast (setup.py)
types-requests==2.30.0.0
+ # via feast (setup.py)
types-setuptools==70.1.0.20240627
- # via types-cffi
+ # via
+ # feast (setup.py)
+ # types-cffi
types-tabulate==0.9.0.20240106
+ # via feast (setup.py)
types-urllib3==1.26.25.14
# via types-requests
typing-extensions==4.12.2
@@ -862,6 +975,7 @@ uri-template==1.3.0
# via jsonschema
urllib3==1.26.19
# via
+ # feast (setup.py)
# botocore
# docker
# elastic-transport
@@ -873,11 +987,15 @@ urllib3==1.26.19
# rockset
# testcontainers
uvicorn[standard]==0.30.1
- # via fastapi
+ # via
+ # feast (setup.py)
+ # fastapi
uvloop==0.19.0
# via uvicorn
virtualenv==20.23.0
- # via pre-commit
+ # via
+ # feast (setup.py)
+ # pre-commit
watchfiles==0.22.0
# via uvicorn
wcwidth==0.2.13
diff --git a/sdk/python/requirements/py3.11-requirements.txt b/sdk/python/requirements/py3.11-requirements.txt
index 687e4bfe52..48104ebc2c 100644
--- a/sdk/python/requirements/py3.11-requirements.txt
+++ b/sdk/python/requirements/py3.11-requirements.txt
@@ -20,23 +20,30 @@ charset-normalizer==3.3.2
# via requests
click==8.1.7
# via
+ # feast (setup.py)
# dask
# typer
# uvicorn
cloudpickle==3.0.0
# via dask
colorama==0.4.6
+ # via feast (setup.py)
dask[dataframe]==2024.5.0
- # via dask-expr
+ # via
+ # feast (setup.py)
+ # dask-expr
dask-expr==1.1.0
# via dask
dill==0.3.8
+ # via feast (setup.py)
dnspython==2.6.1
# via email-validator
email-validator==2.1.1
# via fastapi
fastapi==0.111.0
- # via fastapi-cli
+ # via
+ # feast (setup.py)
+ # fastapi-cli
fastapi-cli==0.0.2
# via fastapi
fsspec==2024.3.1
@@ -44,6 +51,7 @@ fsspec==2024.3.1
greenlet==3.0.3
# via sqlalchemy
gunicorn==22.0.0
+ # via feast (setup.py)
h11==0.14.0
# via
# httpcore
@@ -63,8 +71,11 @@ idna==3.7
importlib-metadata==7.1.0
# via dask
jinja2==3.1.4
- # via fastapi
+ # via
+ # feast (setup.py)
+ # fastapi
jsonschema==4.22.0
+ # via feast (setup.py)
jsonschema-specifications==2023.12.1
# via jsonschema
locket==1.0.0
@@ -76,13 +87,16 @@ markupsafe==2.1.5
mdurl==0.1.2
# via markdown-it-py
mmh3==4.1.0
+ # via feast (setup.py)
mypy==1.10.0
# via sqlalchemy
mypy-extensions==1.0.0
# via mypy
mypy-protobuf==3.6.0
+ # via feast (setup.py)
numpy==1.26.4
# via
+ # feast (setup.py)
# dask
# pandas
# pyarrow
@@ -94,20 +108,33 @@ packaging==24.0
# gunicorn
pandas==2.2.2
# via
+ # feast (setup.py)
# dask
# dask-expr
partd==1.4.2
# via dask
+prometheus-client==0.20.0
+ # via feast (setup.py)
protobuf==4.25.3
- # via mypy-protobuf
+ # via
+ # feast (setup.py)
+ # mypy-protobuf
+psutil==6.0.0
+ # via feast (setup.py)
pyarrow==16.0.0
- # via dask-expr
+ # via
+ # feast (setup.py)
+ # dask-expr
pydantic==2.7.1
- # via fastapi
+ # via
+ # feast (setup.py)
+ # fastapi
pydantic-core==2.18.2
# via pydantic
pygments==2.18.0
- # via rich
+ # via
+ # feast (setup.py)
+ # rich
python-dateutil==2.9.0.post0
# via pandas
python-dotenv==1.0.1
@@ -118,6 +145,7 @@ pytz==2024.1
# via pandas
pyyaml==6.0.1
# via
+ # feast (setup.py)
# dask
# uvicorn
referencing==0.35.1
@@ -125,6 +153,7 @@ referencing==0.35.1
# jsonschema
# jsonschema-specifications
requests==2.31.0
+ # via feast (setup.py)
rich==13.7.1
# via typer
rpds-py==0.18.1
@@ -140,17 +169,23 @@ sniffio==1.3.1
# anyio
# httpx
sqlalchemy[mypy]==2.0.30
+ # via feast (setup.py)
starlette==0.37.2
# via fastapi
tabulate==0.9.0
+ # via feast (setup.py)
tenacity==8.3.0
+ # via feast (setup.py)
toml==0.10.2
+ # via feast (setup.py)
toolz==0.12.1
# via
# dask
# partd
tqdm==4.66.4
+ # via feast (setup.py)
typeguard==4.2.1
+ # via feast (setup.py)
typer==0.12.3
# via fastapi-cli
types-protobuf==5.26.0.20240422
@@ -172,6 +207,7 @@ urllib3==2.2.1
# via requests
uvicorn[standard]==0.29.0
# via
+ # feast (setup.py)
# fastapi
# fastapi-cli
uvloop==0.19.0
diff --git a/sdk/python/requirements/py3.9-ci-requirements.txt b/sdk/python/requirements/py3.9-ci-requirements.txt
index 017c1c8920..5055b3c79f 100644
--- a/sdk/python/requirements/py3.9-ci-requirements.txt
+++ b/sdk/python/requirements/py3.9-ci-requirements.txt
@@ -1,6 +1,7 @@
# This file was autogenerated by uv via the following command:
# uv pip compile --system --no-strip-extras setup.py --extra ci --output-file sdk/python/requirements/py3.9-ci-requirements.txt
aiobotocore==2.13.1
+ # via feast (setup.py)
aiohttp==3.9.5
# via aiobotocore
aioitertools==0.11.0
@@ -19,6 +20,8 @@ anyio==4.4.0
# jupyter-server
# starlette
# watchfiles
+appnope==0.1.4
+ # via ipykernel
argon2-cffi==23.1.0
# via jupyter-server
argon2-cffi-bindings==21.2.0
@@ -28,6 +31,7 @@ arrow==1.3.0
asn1crypto==1.5.1
# via snowflake-connector-python
assertpy==1.1
+ # via feast (setup.py)
asttokens==2.4.1
# via stack-data
async-lru==2.0.4
@@ -48,7 +52,9 @@ azure-core==1.30.2
# azure-identity
# azure-storage-blob
azure-identity==1.17.1
+ # via feast (setup.py)
azure-storage-blob==12.20.0
+ # via feast (setup.py)
babel==2.15.0
# via
# jupyterlab-server
@@ -60,7 +66,9 @@ bidict==0.23.1
bleach==6.1.0
# via nbconvert
boto3==1.34.131
- # via moto
+ # via
+ # feast (setup.py)
+ # moto
botocore==1.34.131
# via
# aiobotocore
@@ -69,11 +77,13 @@ botocore==1.34.131
# s3transfer
build==1.2.1
# via
+ # feast (setup.py)
# pip-tools
# singlestoredb
cachetools==5.3.3
# via google-auth
cassandra-driver==3.29.1
+ # via feast (setup.py)
certifi==2024.7.4
# via
# elastic-transport
@@ -96,6 +106,7 @@ charset-normalizer==3.3.2
# snowflake-connector-python
click==8.1.7
# via
+ # feast (setup.py)
# dask
# geomet
# great-expectations
@@ -105,7 +116,9 @@ click==8.1.7
cloudpickle==3.0.0
# via dask
colorama==0.4.6
- # via great-expectations
+ # via
+ # feast (setup.py)
+ # great-expectations
comm==0.2.2
# via
# ipykernel
@@ -114,6 +127,7 @@ coverage[toml]==7.5.4
# via pytest-cov
cryptography==42.0.8
# via
+ # feast (setup.py)
# azure-identity
# azure-storage-blob
# great-expectations
@@ -125,7 +139,9 @@ cryptography==42.0.8
# types-pyopenssl
# types-redis
dask[dataframe]==2024.6.2
- # via dask-expr
+ # via
+ # feast (setup.py)
+ # dask-expr
dask-expr==1.1.6
# via dask
db-dtypes==1.2.0
@@ -137,7 +153,9 @@ decorator==5.1.1
defusedxml==0.7.1
# via nbconvert
deltalake==0.18.1
+ # via feast (setup.py)
dill==0.3.8
+ # via feast (setup.py)
distlib==0.3.8
# via virtualenv
dnspython==2.6.1
@@ -151,6 +169,7 @@ duckdb==0.10.3
elastic-transport==8.13.1
# via elasticsearch
elasticsearch==8.14.0
+ # via feast (setup.py)
email-validator==2.2.0
# via fastapi
entrypoints==0.4
@@ -165,6 +184,7 @@ execnet==2.1.1
executing==2.0.1
# via stack-data
fastapi==0.111.0
+ # via feast (setup.py)
fastapi-cli==0.0.4
# via fastapi
fastjsonschema==2.20.0
@@ -180,13 +200,16 @@ frozenlist==1.4.1
# aiohttp
# aiosignal
fsspec==2023.12.2
- # via dask
+ # via
+ # feast (setup.py)
+ # dask
geojson==2.5.0
# via rockset
geomet==0.2.1.post1
# via cassandra-driver
google-api-core[grpc]==2.19.1
# via
+ # feast (setup.py)
# google-cloud-bigquery
# google-cloud-bigquery-storage
# google-cloud-bigtable
@@ -201,8 +224,11 @@ google-auth==2.30.0
# google-cloud-storage
# kubernetes
google-cloud-bigquery[pandas]==3.13.0
+ # via feast (setup.py)
google-cloud-bigquery-storage==2.25.0
+ # via feast (setup.py)
google-cloud-bigtable==2.24.0
+ # via feast (setup.py)
google-cloud-core==2.4.1
# via
# google-cloud-bigquery
@@ -210,7 +236,9 @@ google-cloud-core==2.4.1
# google-cloud-datastore
# google-cloud-storage
google-cloud-datastore==2.19.0
+ # via feast (setup.py)
google-cloud-storage==2.17.0
+ # via feast (setup.py)
google-crc32c==1.5.0
# via
# google-cloud-storage
@@ -221,16 +249,19 @@ google-resumable-media==2.7.1
# google-cloud-storage
googleapis-common-protos[grpc]==1.63.2
# via
+ # feast (setup.py)
# google-api-core
# grpc-google-iam-v1
# grpcio-status
great-expectations==0.18.16
+ # via feast (setup.py)
greenlet==3.0.3
# via sqlalchemy
grpc-google-iam-v1==0.13.1
# via google-cloud-bigtable
grpcio==1.64.1
# via
+ # feast (setup.py)
# google-api-core
# google-cloud-bigquery
# googleapis-common-protos
@@ -241,30 +272,42 @@ grpcio==1.64.1
# grpcio-testing
# grpcio-tools
grpcio-health-checking==1.62.2
+ # via feast (setup.py)
grpcio-reflection==1.62.2
+ # via feast (setup.py)
grpcio-status==1.62.2
# via google-api-core
grpcio-testing==1.62.2
+ # via feast (setup.py)
grpcio-tools==1.62.2
+ # via feast (setup.py)
gunicorn==22.0.0
+ # via feast (setup.py)
h11==0.14.0
# via
# httpcore
# uvicorn
happybase==1.2.0
+ # via feast (setup.py)
hazelcast-python-client==5.4.0
+ # via feast (setup.py)
hiredis==2.3.2
+ # via feast (setup.py)
httpcore==1.0.5
# via httpx
httptools==0.6.1
# via uvicorn
httpx==0.27.0
# via
+ # feast (setup.py)
# fastapi
# jupyterlab
ibis-framework[duckdb]==9.0.0
- # via ibis-substrait
+ # via
+ # feast (setup.py)
+ # ibis-substrait
ibis-substrait==4.0.0
+ # via feast (setup.py)
identify==2.5.36
# via pre-commit
idna==3.7
@@ -308,6 +351,7 @@ jedi==0.19.1
# via ipython
jinja2==3.1.4
# via
+ # feast (setup.py)
# altair
# fastapi
# great-expectations
@@ -331,6 +375,7 @@ jsonpointer==3.0.0
# jsonschema
jsonschema[format-nongpl]==4.22.0
# via
+ # feast (setup.py)
# altair
# great-expectations
# jupyter-events
@@ -376,6 +421,7 @@ jupyterlab-server==2.27.2
jupyterlab-widgets==3.0.11
# via ipywidgets
kubernetes==20.13.0
+ # via feast (setup.py)
locket==1.0.0
# via partd
makefun==1.15.2
@@ -396,13 +442,17 @@ matplotlib-inline==0.1.7
mdurl==0.1.2
# via markdown-it-py
minio==7.1.0
+ # via feast (setup.py)
mistune==3.0.2
# via
# great-expectations
# nbconvert
mmh3==4.1.0
+ # via feast (setup.py)
mock==2.0.0
+ # via feast (setup.py)
moto==4.2.14
+ # via feast (setup.py)
msal==1.29.0
# via
# azure-identity
@@ -414,10 +464,13 @@ multidict==6.0.5
# aiohttp
# yarl
mypy==1.10.1
- # via sqlalchemy
+ # via
+ # feast (setup.py)
+ # sqlalchemy
mypy-extensions==1.0.0
# via mypy
mypy-protobuf==3.3.0
+ # via feast (setup.py)
nbclient==0.10.0
# via nbconvert
nbconvert==7.16.4
@@ -440,6 +493,7 @@ notebook-shim==0.2.4
# notebook
numpy==1.26.4
# via
+ # feast (setup.py)
# altair
# dask
# db-dtypes
@@ -474,6 +528,7 @@ packaging==24.1
# sphinx
pandas==2.2.2
# via
+ # feast (setup.py)
# altair
# dask
# dask-expr
@@ -499,6 +554,7 @@ pexpect==4.9.0
pip==24.1.1
# via pip-tools
pip-tools==7.4.1
+ # via feast (setup.py)
platformdirs==3.11.0
# via
# jupyter-core
@@ -511,8 +567,11 @@ ply==3.11
portalocker==2.10.0
# via msal-extensions
pre-commit==3.3.1
+ # via feast (setup.py)
prometheus-client==0.20.0
- # via jupyter-server
+ # via
+ # feast (setup.py)
+ # jupyter-server
prompt-toolkit==3.0.47
# via ipython
proto-plus==1.24.0
@@ -524,6 +583,7 @@ proto-plus==1.24.0
# google-cloud-datastore
protobuf==4.25.3
# via
+ # feast (setup.py)
# google-api-core
# google-cloud-bigquery
# google-cloud-bigquery-storage
@@ -540,8 +600,11 @@ protobuf==4.25.3
# proto-plus
# substrait
psutil==5.9.0
- # via ipykernel
+ # via
+ # feast (setup.py)
+ # ipykernel
psycopg[binary, pool]==3.1.18
+ # via feast (setup.py)
psycopg-binary==3.1.18
# via psycopg
psycopg-pool==3.2.2
@@ -553,12 +616,14 @@ ptyprocess==0.7.0
pure-eval==0.2.2
# via stack-data
py==1.11.0
+ # via feast (setup.py)
py-cpuinfo==9.0.0
# via pytest-benchmark
py4j==0.10.9.7
# via pyspark
pyarrow==15.0.2
# via
+ # feast (setup.py)
# dask-expr
# db-dtypes
# deltalake
@@ -576,16 +641,19 @@ pyasn1==0.6.0
pyasn1-modules==0.4.0
# via google-auth
pybindgen==0.22.1
+ # via feast (setup.py)
pycparser==2.22
# via cffi
pydantic==2.7.4
# via
+ # feast (setup.py)
# fastapi
# great-expectations
pydantic-core==2.18.4
# via pydantic
pygments==2.18.0
# via
+ # feast (setup.py)
# ipython
# nbconvert
# rich
@@ -596,8 +664,11 @@ pyjwt[crypto]==2.8.0
# singlestoredb
# snowflake-connector-python
pymssql==2.3.0
+ # via feast (setup.py)
pymysql==1.1.1
+ # via feast (setup.py)
pyodbc==5.1.0
+ # via feast (setup.py)
pyopenssl==24.1.0
# via snowflake-connector-python
pyparsing==3.1.2
@@ -607,8 +678,10 @@ pyproject-hooks==1.1.0
# build
# pip-tools
pyspark==3.5.1
+ # via feast (setup.py)
pytest==7.4.4
# via
+ # feast (setup.py)
# pytest-benchmark
# pytest-cov
# pytest-env
@@ -618,13 +691,21 @@ pytest==7.4.4
# pytest-timeout
# pytest-xdist
pytest-benchmark==3.4.1
+ # via feast (setup.py)
pytest-cov==5.0.0
+ # via feast (setup.py)
pytest-env==1.1.3
+ # via feast (setup.py)
pytest-lazy-fixture==0.6.3
+ # via feast (setup.py)
pytest-mock==1.10.4
+ # via feast (setup.py)
pytest-ordering==0.6
+ # via feast (setup.py)
pytest-timeout==1.4.2
+ # via feast (setup.py)
pytest-xdist==3.6.1
+ # via feast (setup.py)
python-dateutil==2.9.0.post0
# via
# arrow
@@ -653,6 +734,7 @@ pytz==2024.1
# trino
pyyaml==6.0.1
# via
+ # feast (setup.py)
# dask
# ibis-substrait
# jupyter-events
@@ -666,15 +748,19 @@ pyzmq==26.0.3
# jupyter-client
# jupyter-server
redis==4.6.0
+ # via feast (setup.py)
referencing==0.35.1
# via
# jsonschema
# jsonschema-specifications
# jupyter-events
regex==2024.5.15
- # via parsimonious
+ # via
+ # feast (setup.py)
+ # parsimonious
requests==2.32.3
# via
+ # feast (setup.py)
# azure-core
# docker
# google-api-core
@@ -708,6 +794,7 @@ rich==13.7.1
# ibis-framework
# typer
rockset==2.1.2
+ # via feast (setup.py)
rpds-py==0.18.1
# via
# jsonschema
@@ -719,6 +806,7 @@ ruamel-yaml==0.17.17
ruamel-yaml-clib==0.2.8
# via ruamel-yaml
ruff==0.4.10
+ # via feast (setup.py)
s3transfer==0.10.2
# via boto3
scipy==1.13.1
@@ -735,6 +823,7 @@ setuptools==70.1.1
shellingham==1.5.4
# via typer
singlestoredb==1.4.0
+ # via feast (setup.py)
six==1.16.0
# via
# asttokens
@@ -755,11 +844,13 @@ sniffio==1.3.1
snowballstemmer==2.2.0
# via sphinx
snowflake-connector-python[pandas]==3.11.0
+ # via feast (setup.py)
sortedcontainers==2.4.0
# via snowflake-connector-python
soupsieve==2.5
# via beautifulsoup4
sphinx==6.2.1
+ # via feast (setup.py)
sphinxcontrib-applehelp==1.0.8
# via sphinx
sphinxcontrib-devhelp==1.0.6
@@ -773,9 +864,11 @@ sphinxcontrib-qthelp==1.0.7
sphinxcontrib-serializinghtml==1.1.10
# via sphinx
sqlalchemy[mypy]==2.0.31
+ # via feast (setup.py)
sqlglot==23.12.2
# via ibis-framework
sqlite-vec==0.0.1a10
+ # via feast (setup.py)
sqlparams==6.0.1
# via singlestoredb
stack-data==0.6.3
@@ -785,17 +878,21 @@ starlette==0.37.2
substrait==0.19.0
# via ibis-substrait
tabulate==0.9.0
+ # via feast (setup.py)
tenacity==8.4.2
+ # via feast (setup.py)
terminado==0.18.1
# via
# jupyter-server
# jupyter-server-terminals
testcontainers==4.4.0
+ # via feast (setup.py)
thriftpy2==0.5.1
# via happybase
tinycss2==1.3.0
# via nbconvert
toml==0.10.2
+ # via feast (setup.py)
tomli==2.0.1
# via
# build
@@ -823,7 +920,9 @@ tornado==6.4.1
# notebook
# terminado
tqdm==4.66.4
- # via great-expectations
+ # via
+ # feast (setup.py)
+ # great-expectations
traitlets==5.14.3
# via
# comm
@@ -840,25 +939,39 @@ traitlets==5.14.3
# nbconvert
# nbformat
trino==0.328.0
+ # via feast (setup.py)
typeguard==4.3.0
+ # via feast (setup.py)
typer==0.12.3
# via fastapi-cli
types-cffi==1.16.0.20240331
# via types-pyopenssl
types-protobuf==3.19.22
- # via mypy-protobuf
+ # via
+ # feast (setup.py)
+ # mypy-protobuf
types-pymysql==1.1.0.20240524
+ # via feast (setup.py)
types-pyopenssl==24.1.0.20240425
# via types-redis
types-python-dateutil==2.9.0.20240316
- # via arrow
+ # via
+ # feast (setup.py)
+ # arrow
types-pytz==2024.1.0.20240417
+ # via feast (setup.py)
types-pyyaml==6.0.12.20240311
+ # via feast (setup.py)
types-redis==4.6.0.20240425
+ # via feast (setup.py)
types-requests==2.30.0.0
+ # via feast (setup.py)
types-setuptools==70.1.0.20240627
- # via types-cffi
+ # via
+ # feast (setup.py)
+ # types-cffi
types-tabulate==0.9.0.20240106
+ # via feast (setup.py)
types-urllib3==1.26.25.14
# via types-requests
typing-extensions==4.12.2
@@ -897,6 +1010,7 @@ uri-template==1.3.0
# via jsonschema
urllib3==1.26.19
# via
+ # feast (setup.py)
# botocore
# docker
# elastic-transport
@@ -909,11 +1023,15 @@ urllib3==1.26.19
# snowflake-connector-python
# testcontainers
uvicorn[standard]==0.30.1
- # via fastapi
+ # via
+ # feast (setup.py)
+ # fastapi
uvloop==0.19.0
# via uvicorn
virtualenv==20.23.0
- # via pre-commit
+ # via
+ # feast (setup.py)
+ # pre-commit
watchfiles==0.22.0
# via uvicorn
wcwidth==0.2.13
diff --git a/sdk/python/requirements/py3.9-requirements.txt b/sdk/python/requirements/py3.9-requirements.txt
index 096f54ab1f..7d549f908d 100644
--- a/sdk/python/requirements/py3.9-requirements.txt
+++ b/sdk/python/requirements/py3.9-requirements.txt
@@ -20,25 +20,32 @@ charset-normalizer==3.3.2
# via requests
click==8.1.7
# via
+ # feast (setup.py)
# dask
# typer
# uvicorn
cloudpickle==3.0.0
# via dask
colorama==0.4.6
+ # via feast (setup.py)
dask[dataframe]==2024.5.0
- # via dask-expr
+ # via
+ # feast (setup.py)
+ # dask-expr
dask-expr==1.1.0
# via dask
dill==0.3.8
+ # via feast (setup.py)
dnspython==2.6.1
# via email-validator
email-validator==2.1.1
# via fastapi
-exceptiongroup==1.2.1
+exceptiongroup==1.2.2
# via anyio
fastapi==0.111.0
- # via fastapi-cli
+ # via
+ # feast (setup.py)
+ # fastapi-cli
fastapi-cli==0.0.2
# via fastapi
fsspec==2024.3.1
@@ -46,6 +53,7 @@ fsspec==2024.3.1
greenlet==3.0.3
# via sqlalchemy
gunicorn==22.0.0
+ # via feast (setup.py)
h11==0.14.0
# via
# httpcore
@@ -62,13 +70,16 @@ idna==3.7
# email-validator
# httpx
# requests
-importlib-metadata==7.1.0
+importlib-metadata==8.2.0
# via
# dask
# typeguard
jinja2==3.1.4
- # via fastapi
+ # via
+ # feast (setup.py)
+ # fastapi
jsonschema==4.22.0
+ # via feast (setup.py)
jsonschema-specifications==2023.12.1
# via jsonschema
locket==1.0.0
@@ -80,13 +91,16 @@ markupsafe==2.1.5
mdurl==0.1.2
# via markdown-it-py
mmh3==4.1.0
+ # via feast (setup.py)
mypy==1.10.0
# via sqlalchemy
mypy-extensions==1.0.0
# via mypy
mypy-protobuf==3.6.0
+ # via feast (setup.py)
numpy==1.26.4
# via
+ # feast (setup.py)
# dask
# pandas
# pyarrow
@@ -98,20 +112,33 @@ packaging==24.0
# gunicorn
pandas==2.2.2
# via
+ # feast (setup.py)
# dask
# dask-expr
partd==1.4.2
# via dask
+prometheus-client==0.20.0
+ # via feast (setup.py)
protobuf==4.25.3
- # via mypy-protobuf
+ # via
+ # feast (setup.py)
+ # mypy-protobuf
+psutil==6.0.0
+ # via feast (setup.py)
pyarrow==16.0.0
- # via dask-expr
+ # via
+ # feast (setup.py)
+ # dask-expr
pydantic==2.7.1
- # via fastapi
+ # via
+ # feast (setup.py)
+ # fastapi
pydantic-core==2.18.2
# via pydantic
pygments==2.18.0
- # via rich
+ # via
+ # feast (setup.py)
+ # rich
python-dateutil==2.9.0.post0
# via pandas
python-dotenv==1.0.1
@@ -122,6 +149,7 @@ pytz==2024.1
# via pandas
pyyaml==6.0.1
# via
+ # feast (setup.py)
# dask
# uvicorn
referencing==0.35.1
@@ -129,6 +157,7 @@ referencing==0.35.1
# jsonschema
# jsonschema-specifications
requests==2.31.0
+ # via feast (setup.py)
rich==13.7.1
# via typer
rpds-py==0.18.1
@@ -144,11 +173,15 @@ sniffio==1.3.1
# anyio
# httpx
sqlalchemy[mypy]==2.0.30
+ # via feast (setup.py)
starlette==0.37.2
# via fastapi
tabulate==0.9.0
+ # via feast (setup.py)
tenacity==8.3.0
+ # via feast (setup.py)
toml==0.10.2
+ # via feast (setup.py)
tomli==2.0.1
# via mypy
toolz==0.12.1
@@ -156,7 +189,9 @@ toolz==0.12.1
# dask
# partd
tqdm==4.66.4
+ # via feast (setup.py)
typeguard==4.2.1
+ # via feast (setup.py)
typer==0.12.3
# via fastapi-cli
types-protobuf==5.26.0.20240422
@@ -181,6 +216,7 @@ urllib3==2.2.1
# via requests
uvicorn[standard]==0.29.0
# via
+ # feast (setup.py)
# fastapi
# fastapi-cli
uvloop==0.19.0
@@ -189,5 +225,5 @@ watchfiles==0.21.0
# via uvicorn
websockets==12.0
# via uvicorn
-zipp==3.19.1
+zipp==3.19.2
# via importlib-metadata
diff --git a/sdk/python/tests/integration/online_store/test_remote_online_store.py b/sdk/python/tests/integration/online_store/test_remote_online_store.py
index 1d5dd0fca0..21ac00583b 100644
--- a/sdk/python/tests/integration/online_store/test_remote_online_store.py
+++ b/sdk/python/tests/integration/online_store/test_remote_online_store.py
@@ -195,7 +195,7 @@ def _overwrite_remote_client_feature_store_yaml(
)
-def _start_feature_server(repo_path: str, server_port: int):
+def _start_feature_server(repo_path: str, server_port: int, metrics: bool = False):
host = "0.0.0.0"
cmd = [
"feast",
@@ -217,6 +217,21 @@ def _start_feature_server(repo_path: str, server_port: int):
timeout_msg=f"Unable to start the feast server in {_time_out_sec} seconds for remote online store type, port={server_port}",
)
+ if metrics:
+ cmd.append("--metrics")
+
+ # Check if metrics are enabled and Prometheus server is running
+ if metrics:
+ wait_retry_backoff(
+ lambda: (None, check_port_open("localhost", 8000)),
+ timeout_secs=_time_out_sec,
+ timeout_msg="Unable to start the Prometheus server in 60 seconds.",
+ )
+ else:
+ assert not check_port_open(
+ "localhost", 8000
+ ), "Prometheus server is running when it should be disabled."
+
yield f"http://localhost:{server_port}"
if feast_server_process is not None:
diff --git a/setup.py b/setup.py
index b983617712..f5a4dd8c62 100644
--- a/setup.py
+++ b/setup.py
@@ -59,6 +59,8 @@
"uvicorn[standard]>=0.14.0,<1",
"gunicorn; platform_system != 'Windows'",
"dask[dataframe]>=2024.2.1",
+ "prometheus_client",
+ "psutil",
]
GCP_REQUIRED = [
@@ -98,6 +100,8 @@
"psycopg[binary,pool]>=3.0.0,<4",
]
+OPENTELEMETRY = ["prometheus_client","psutil"]
+
MYSQL_REQUIRED = ["pymysql", "types-PyMySQL"]
HBASE_REQUIRED = [
@@ -215,6 +219,7 @@
+ ELASTICSEARCH_REQUIRED
+ SQLITE_VEC_REQUIRED
+ SINGLESTORE_REQUIRED
+ + OPENTELEMETRY
)
DOCS_REQUIRED = CI_REQUIRED
@@ -385,6 +390,7 @@ def run(self):
"elasticsearch": ELASTICSEARCH_REQUIRED,
"sqlite_vec": SQLITE_VEC_REQUIRED,
"singlestore": SINGLESTORE_REQUIRED,
+ "opentelemetry": OPENTELEMETRY,
},
include_package_data=True,
license="Apache",