From a75116c9fc2d1038eb5c774de72fe32bbed4e160 Mon Sep 17 00:00:00 2001 From: David Heryanto Date: Tue, 19 Nov 2019 16:28:41 +0800 Subject: [PATCH 1/7] Fix import error in Feast CLI (#314) Due to this error: AttributeError: module 'feast.loaders.file' has no attribute 'yaml_loader' Since yaml_loader() function has been moved to a module feast.loaders.yaml --- sdk/python/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/python/cli.py b/sdk/python/cli.py index 652bc038854..6d9ff1e7105 100644 --- a/sdk/python/cli.py +++ b/sdk/python/cli.py @@ -21,7 +21,7 @@ from feast.feature_set import FeatureSet import toml import pkg_resources -from feast.loaders import file +from feast.loaders.yaml import yaml_loader import yaml import json @@ -225,7 +225,7 @@ def apply(filename): resources = [ ResourceFactory.get_resource(res_dict["kind"]).from_dict(res_dict) - for res_dict in file.yaml_loader(filename) + for res_dict in yaml_loader(filename) ] feast_client = Client( From 2d8cc6f23357889b8fd6cfc4c73bdd9ce8efb8c9 Mon Sep 17 00:00:00 2001 From: Willem Pienaar Date: Tue, 19 Nov 2019 21:00:53 +0800 Subject: [PATCH 2/7] Removed unnecessary "sources" in Python SDK unit tests --- sdk/python/tests/test_client.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/sdk/python/tests/test_client.py b/sdk/python/tests/test_client.py index a2457a50927..52741e0d6aa 100644 --- a/sdk/python/tests/test_client.py +++ b/sdk/python/tests/test_client.py @@ -367,11 +367,6 @@ def test_feature_set_ingest_success(self, dataframe, client, mocker): driver_fs.add(Feature(name="feature_3", dtype=ValueType.INT64)) driver_fs.add(Entity(name="entity_id", dtype=ValueType.INT64)) - driver_fs.source = KafkaSource(topic="feature-topic", brokers="127.0.0.1") - - client._message_producer = MagicMock() - client._message_producer.produce = MagicMock() - # Register with Feast core client.apply(driver_fs) @@ -397,11 +392,6 @@ def test_feature_set_ingest_failure(self, client, dataframe, exception): with pytest.raises(exception): # Create feature set driver_fs = FeatureSet("driver-feature-set") - driver_fs.source = KafkaSource( - topic="feature-topic", brokers="fake.broker.com" - ) - client._message_producer = MagicMock() - client._message_producer.produce = MagicMock() # Update based on dataset driver_fs.infer_fields_from_df(dataframe) @@ -437,10 +427,6 @@ def test_feature_set_types_success(self, client, dataframe, mocker): max_age=Duration(seconds=3600), ) - all_types_fs.source = KafkaSource(topic="feature-topic", brokers="127.0.0.1") - client._message_producer = MagicMock() - client._message_producer.produce = MagicMock() - # Register with Feast core client.apply(all_types_fs) From e146e3a3e1a28314b8a4a0ee6aca72d948c901a3 Mon Sep 17 00:00:00 2001 From: Chen Zhiling Date: Thu, 21 Nov 2019 08:04:41 +0800 Subject: [PATCH 3/7] Change default job metrics sink to statsd (#315) * Change default job metrics sink to statsd * Change port to 9125 --- core/src/main/resources/application.yml | 12 +++++------- infra/charts/feast/charts/feast-core/values.yaml | 4 ++-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/core/src/main/resources/application.yml b/core/src/main/resources/application.yml index be4f8c6b72a..ed11d6c9ebf 100644 --- a/core/src/main/resources/application.yml +++ b/core/src/main/resources/application.yml @@ -33,14 +33,12 @@ feast: metrics: # Enable metrics pushing for all ingestion jobs. enabled: false - # Type of metrics sink. Only prometheus is currently supported. - type: prometheus - # Host of the metrics sink. In the case of prometheus, this is the host of the prometheus - # pushGateway to sink metrics to. + # Type of metrics sink. Only statsd is currently supported. + type: statsd + # Host of the metrics sink. host: localhost - # Port of the metrics sink. In the case of prometheus, this is the port of the prometheus - # pushGateway to sink metrics to. - port: 9091 + # Port of the metrics sink. + port: 9125 stream: # Feature stream type. Only kafka is supported. diff --git a/infra/charts/feast/charts/feast-core/values.yaml b/infra/charts/feast/charts/feast-core/values.yaml index 5fddd4daaa3..db1f2f5bbd5 100644 --- a/infra/charts/feast/charts/feast-core/values.yaml +++ b/infra/charts/feast/charts/feast-core/values.yaml @@ -64,9 +64,9 @@ application.yaml: options: {} metrics: enabled: false - type: prometheus + type: statsd host: localhost - port: 9091 + port: 9125 stream: type: kafka options: From 31aaed46e4556188ade5599ac4ac0a2bb4f3ca84 Mon Sep 17 00:00:00 2001 From: Willem Pienaar <6728866+woop@users.noreply.github.com> Date: Sat, 23 Nov 2019 10:35:51 +0530 Subject: [PATCH 4/7] Update README.md to remove out of date information --- README.md | 74 +++++++++++++++++++------------------------------------ 1 file changed, 25 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 188c1d8899f..21c9d7fdff0 100644 --- a/README.md +++ b/README.md @@ -2,62 +2,38 @@ ## Overview -Feast (Feature Store) is a tool to manage storage and access of machine learning features. +Feast (Feature Store) is a tool for managing and serving machine learning features. Feast is the bridge between models and data. -It aims to: -* Support ingesting feature data via batch or streaming -* Provide scalable storage of feature data for serving and training -* Provide an API for low latency access of features -* Enable discovery and documentation of features -* Provide an overview of the general health of features in the system +Feast aims to: +* Provide a unified means of managing feature data from a single person to large enterprises. +* Provide scalable and performant access to feature data when training and serving models. +* Provide consistent and point-in-time correct access to feature data. +* Enable discovery, documentation, and insights into your features. -## High Level Architecture +![](docs/.gitbook/assets/feast-docs-overview-diagram-2.svg) -![Feast Architecture](docs/assets/arch.png) +TL;DR: Feast decouples feature engineering from feature usage. Features that are added to Feast become available immediately for training and serving. Models can retrieve the same features used in training from a low latency online store in production. +This means that new ML projects start with a process of feature selection from a catalog instead of having to do feature engineering from scratch. -The Feast platform is broken down into the following functional areas: +``` +# Setting things up +fs = feast.Client('feast.example.com') +customer_features = ['CreditScore', 'Balance', 'Age', 'NumOfProducts', 'IsActive'] -* __Create__ features based on defined format and programming model -* __Ingest__ features via streaming input, import from files or BigQuery tables, and write to an appropriate data store -* __Store__ feature data for both serving and training purposes based on feature access patterns -* __Access__ features for training and serving -* __Discover__ information about entities and features stored and served by Feast +# Training your model (typically from a notebook or pipeline) +data = fs.get_batch_features(customer_features, customer_entities) +my_model = ml.fit(data) -## Motivation +# Serving predictions (when serving the model in production) +prediction = my_model.predict(fs.get_online_features(customer_features, customer_entities)) +``` -__Access to features in serving__: Machine learning models typically require access to features created in both batch pipelines, and real time streams. Feast provides a means for accessing these features in a serving environment, at low latency and high load. - -__Consistency between training and serving__: In many machine learning systems there exists a disconnect between features that are created in batch pipelines for the training of a model, and ones that are created from streams for the serving of real-time features. By centralizing the ingestion of features, Feast provides a consistent view of both batch and real-time features, in both training and serving. - -__Infrastructure management__: Feast abstracts away much of the engineering overhead associated with managing data infrastructure. It handles the ingestion, storage, and serving of large amount of feature data in a scalable way. The system configures data models based on your registered feature specifications, and ensures that you always have a consistent view of features in both your historical and real-time data stores. - -__Feature standardisation__: Feast presents a centralized platform on which teams can register features in a standardized way using specifications. This provides structure to the way features are defined and allows teams to reference features in discussions with a singly understood link. - -__Discovery__: Feast allows users to easily explore and discover features and their associated information. This allows for a deeper understanding of features and theirs specifications, more feature reuse between teams and projects, and faster experimentation. Each new ML project can leverage features that have been created by prior teams, which compounds an organization's ability to discover new insights. +## Important resources + * [Why Feast?](docs/why-feast.md) + * [Concepts](docs/concepts.md) + * [Installation](docs/getting-started/install-feast.md) + * [Getting Help](docs/community.md) ## Notice -Feast is still under active development. Your feedback and contributions are important to us. Please check our [contributing guide](CONTRIBUTING.md) for details. - -## Source Code Headers - -Every file containing source code must include copyright and license -information. This includes any JS/CSS files that you might be serving out to -browsers. (This is to help well-intentioned people avoid accidental copying that -doesn't comply with the license.) - -Apache header: - - Copyright 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. +Feast is a community project and is still under active development. Your feedback and contributions are important to us. Please have a look at our [contributing guide](CONTRIBUTING.md) for details. From a79c77b788821f9ed49f2ccc71f5142f4de7db1c Mon Sep 17 00:00:00 2001 From: Chen Zhiling Date: Mon, 25 Nov 2019 12:10:42 +0800 Subject: [PATCH 5/7] Add prometheus metrics to serving (#316) * Add prometheus metrics to serving * Add subsystem * Use histogram instead of summary * Change timer to histogram timer * Fix configuration for serving chart for prometheus * Fix application.yaml reference in chart --- .../feast-serving/templates/deployment.yaml | 7 ++++ .../feast/charts/feast-serving/values.yaml | 5 +++ serving/pom.xml | 24 ++++++++++++ .../configuration/InstrumentationConfig.java | 10 +++++ .../service/BigQueryServingService.java | 12 ++++-- .../serving/service/CachedSpecService.java | 13 +++++++ .../serving/service/RedisServingService.java | 39 ++++++++++++++++--- .../main/java/feast/serving/util/Metrics.java | 37 ++++++++++++++++++ serving/src/main/resources/application.yml | 2 +- 9 files changed, 140 insertions(+), 9 deletions(-) create mode 100644 serving/src/main/java/feast/serving/util/Metrics.java diff --git a/infra/charts/feast/charts/feast-serving/templates/deployment.yaml b/infra/charts/feast/charts/feast-serving/templates/deployment.yaml index c209a75ee58..ec04acd3013 100644 --- a/infra/charts/feast/charts/feast-serving/templates/deployment.yaml +++ b/infra/charts/feast/charts/feast-serving/templates/deployment.yaml @@ -9,6 +9,13 @@ metadata: chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} + annotations: + {{- if .Values.prometheus.enabled }} + {{ $config := index .Values "application.yaml" }} + prometheus.io/path: /metrics + prometheus.io/port: "{{ $config.server.port }}" + prometheus.io/scrape: "true" + {{- end }} spec: replicas: {{ .Values.replicaCount }} selector: diff --git a/infra/charts/feast/charts/feast-serving/values.yaml b/infra/charts/feast/charts/feast-serving/values.yaml index 5780eda4e42..8f109a09059 100644 --- a/infra/charts/feast/charts/feast-serving/values.yaml +++ b/infra/charts/feast/charts/feast-serving/values.yaml @@ -63,6 +63,8 @@ application.yaml: grpc: port: 6566 enable-reflection: true + server: + port: 8080 spring: main: web-application-type: none @@ -177,6 +179,9 @@ ingress: # - host: chart-example.local # port: http +prometheus: + enabled: true + resources: {} # We usually recommend not to specify default resources and to leave this as a conscious # choice for the user. This also increases chances charts run on environments with little diff --git a/serving/pom.xml b/serving/pom.xml index a5d4ae4f493..9de7d24b29e 100644 --- a/serving/pom.xml +++ b/serving/pom.xml @@ -168,6 +168,30 @@ 0.31.0 + + + io.prometheus + simpleclient + 0.8.0 + + + + io.prometheus + simpleclient_hotspot + 0.8.0 + + + + io.prometheus + simpleclient_servlet + 0.8.0 + + + io.prometheus + simpleclient_spring_boot + 0.8.0 + + com.google.cloud diff --git a/serving/src/main/java/feast/serving/configuration/InstrumentationConfig.java b/serving/src/main/java/feast/serving/configuration/InstrumentationConfig.java index b475369c4db..ead8e67b73d 100644 --- a/serving/src/main/java/feast/serving/configuration/InstrumentationConfig.java +++ b/serving/src/main/java/feast/serving/configuration/InstrumentationConfig.java @@ -3,12 +3,16 @@ import feast.serving.FeastProperties; import io.opentracing.Tracer; import io.opentracing.noop.NoopTracerFactory; +import io.prometheus.client.hotspot.DefaultExports; +import io.prometheus.client.exporter.MetricsServlet; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class InstrumentationConfig { + private FeastProperties feastProperties; @Autowired @@ -16,6 +20,12 @@ public InstrumentationConfig(FeastProperties feastProperties) { this.feastProperties = feastProperties; } + @Bean + public ServletRegistrationBean servletRegistrationBean() { + DefaultExports.initialize(); + return new ServletRegistrationBean(new MetricsServlet(), "/metrics"); + } + @Bean public Tracer tracer() { if (!feastProperties.getTracing().isEnabled()) { diff --git a/serving/src/main/java/feast/serving/service/BigQueryServingService.java b/serving/src/main/java/feast/serving/service/BigQueryServingService.java index 9d93d4dd06c..be8ccf7fee1 100644 --- a/serving/src/main/java/feast/serving/service/BigQueryServingService.java +++ b/serving/src/main/java/feast/serving/service/BigQueryServingService.java @@ -1,6 +1,8 @@ package feast.serving.service; import static feast.serving.util.BigQueryUtil.getTimestampLimitQuery; +import static feast.serving.util.Metrics.requestCount; +import static feast.serving.util.Metrics.requestLatency; import com.google.cloud.bigquery.BigQuery; import com.google.cloud.bigquery.BigQueryException; @@ -37,6 +39,7 @@ import feast.serving.ServingAPIProto.JobType; import feast.serving.util.BigQueryUtil; import io.grpc.Status; +import io.prometheus.client.Histogram.Timer; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -100,11 +103,13 @@ public GetOnlineFeaturesResponse getOnlineFeatures(GetOnlineFeaturesRequest getF */ @Override public GetBatchFeaturesResponse getBatchFeatures(GetBatchFeaturesRequest getFeaturesRequest) { - + Timer getBatchFeaturesTimer = requestLatency.labels("getBatchFeatures").startTimer(); List featureSetSpecs = getFeaturesRequest.getFeatureSetsList().stream() - .map(featureSet -> - specService.getFeatureSet(featureSet.getName(), featureSet.getVersion()) + .map(featureSet -> { + requestCount.labels(featureSet.getName()).inc(); + return specService.getFeatureSet(featureSet.getName(), featureSet.getVersion()); + } ) .collect(Collectors.toList()); @@ -233,6 +238,7 @@ public GetBatchFeaturesResponse getBatchFeatures(GetBatchFeaturesRequest getFeat }) .start(); + getBatchFeaturesTimer.observeDuration(); return GetBatchFeaturesResponse.newBuilder().setJob(feastJob).build(); } diff --git a/serving/src/main/java/feast/serving/service/CachedSpecService.java b/serving/src/main/java/feast/serving/service/CachedSpecService.java index df08fb7b384..dd1be0bf7d8 100644 --- a/serving/src/main/java/feast/serving/service/CachedSpecService.java +++ b/serving/src/main/java/feast/serving/service/CachedSpecService.java @@ -16,6 +16,7 @@ import feast.core.StoreProto.Store.Subscription; import feast.serving.exception.SpecRetrievalException; import io.grpc.StatusRuntimeException; +import io.prometheus.client.Gauge; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -40,6 +41,15 @@ public class CachedSpecService { private final LoadingCache featureSetSpecCache; private Store store; + private static Gauge featureSetsCount = Gauge.build().name("feature_set_count") + .subsystem("feast_serving") + .help("number of feature sets served by this instance") + .register(); + private static Gauge cacheLastUpdated = Gauge.build().name("cache_last_updated") + .subsystem("feast_serving") + .help("epoch time of the last time the cache was updated") + .register(); + public CachedSpecService(CoreSpecService coreService, Path configPath) { this.configPath = configPath; this.coreService = coreService; @@ -102,6 +112,9 @@ public void populateCache() { this.store = updateStore(readConfig(configPath)); Map featureSetSpecMap = getFeatureSetSpecMap(); featureSetSpecCache.putAll(featureSetSpecMap); + + featureSetsCount.set(featureSetSpecCache.size()); + cacheLastUpdated.set(System.currentTimeMillis()); } public void scheduledPopulateCache() { diff --git a/serving/src/main/java/feast/serving/service/RedisServingService.java b/serving/src/main/java/feast/serving/service/RedisServingService.java index 69feec724fb..aec8a4bfb4c 100644 --- a/serving/src/main/java/feast/serving/service/RedisServingService.java +++ b/serving/src/main/java/feast/serving/service/RedisServingService.java @@ -16,6 +16,11 @@ package feast.serving.service; +import static feast.serving.util.Metrics.missingKeyCount; +import static feast.serving.util.Metrics.requestLatency; +import static feast.serving.util.Metrics.requestCount; +import static feast.serving.util.Metrics.staleKeyCount; + import com.google.common.collect.Maps; import com.google.protobuf.AbstractMessageLite; import com.google.protobuf.Duration; @@ -41,6 +46,7 @@ import io.grpc.Status; import io.opentracing.Scope; import io.opentracing.Tracer; +import io.prometheus.client.Histogram.Timer; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -61,7 +67,9 @@ public RedisServingService(JedisPool jedisPool, CachedSpecService specService, T this.tracer = tracer; } - /** {@inheritDoc} */ + /** + * {@inheritDoc} + */ @Override public GetFeastServingInfoResponse getFeastServingInfo( GetFeastServingInfoRequest getFeastServingInfoRequest) { @@ -70,10 +78,13 @@ public GetFeastServingInfoResponse getFeastServingInfo( .build(); } - /** {@inheritDoc} */ + /** + * {@inheritDoc} + */ @Override public GetOnlineFeaturesResponse getOnlineFeatures(GetOnlineFeaturesRequest request) { try (Scope scope = tracer.buildSpan("Redis-getOnlineFeatures").startActive(true)) { + Timer getOnlineFeaturesTimer = requestLatency.labels("getOnlineFeatures").startTimer(); GetOnlineFeaturesResponse.Builder getOnlineFeaturesResponseBuilder = GetOnlineFeaturesResponse.newBuilder(); @@ -114,6 +125,7 @@ public GetOnlineFeaturesResponse getOnlineFeatures(GetOnlineFeaturesRequest requ featureValuesMap.values().stream() .map(m -> FieldValues.newBuilder().putAllFields(m).build()) .collect(Collectors.toList()); + getOnlineFeaturesTimer.observeDuration(); return getOnlineFeaturesResponseBuilder.addAllFieldValues(fieldValues).build(); } } @@ -166,9 +178,11 @@ private RedisKey makeRedisKey( for (int i = 0; i < featureSetEntityNames.size(); i++) { String entityName = featureSetEntityNames.get(i); - if (!fieldsMap.containsKey(entityName)){ + if (!fieldsMap.containsKey(entityName)) { throw Status.INVALID_ARGUMENT - .withDescription(String.format("Entity row fields \"%s\" does not contain required entity field \"%s\"", fieldsMap.keySet().toString(), entityName)) + .withDescription(String + .format("Entity row fields \"%s\" does not contain required entity field \"%s\"", + fieldsMap.keySet().toString(), entityName)) .asRuntimeException(); } @@ -186,33 +200,45 @@ private void sendAndProcessMultiGet( throws InvalidProtocolBufferException { List jedisResps = sendMultiGet(redisKeys); - + Timer processResponseTimer = requestLatency.labels("processResponse") + .startTimer(); try (Scope scope = tracer.buildSpan("Redis-processResponse").startActive(true)) { String featureSetId = String.format("%s:%d", featureSetRequest.getName(), featureSetRequest.getVersion()); + Map nullValues = featureSetRequest.getFeatureNamesList().stream() .collect( Collectors.toMap( name -> featureSetId + ":" + name, name -> Value.newBuilder().build())); + for (int i = 0; i < jedisResps.size(); i++) { EntityRow entityRow = entityRows.get(i); Map featureValues = featureValuesMap.get(entityRow); + byte[] jedisResponse = jedisResps.get(i); if (jedisResponse == null) { + missingKeyCount.labels(featureSetRequest.getName()).inc(); featureValues.putAll(nullValues); continue; } + FeatureRow featureRow = FeatureRow.parseFrom(jedisResponse); + boolean stale = isStale(featureSetRequest, entityRow, featureRow); if (stale) { + staleKeyCount.labels(featureSetRequest.getName()).inc(); featureValues.putAll(nullValues); continue; } + + requestCount.labels(featureSetRequest.getName()).inc(); featureRow.getFieldsList().stream() .filter(f -> featureSetRequest.getFeatureNamesList().contains(f.getName())) .forEach(f -> featureValues.put(featureSetId + ":" + f.getName(), f.getValue())); } + } finally { + processResponseTimer.observeDuration(); } } @@ -237,6 +263,7 @@ private boolean isStale( */ private List sendMultiGet(List keys) { try (Scope scope = tracer.buildSpan("Redis-sendMultiGet").startActive(true)) { + Timer sendMultiGetTimer = requestLatency.labels("sendMultiGet").startTimer(); try (Jedis jedis = jedisPool.getResource()) { byte[][] binaryKeys = keys.stream() @@ -249,6 +276,8 @@ private List sendMultiGet(List keys) { .withDescription("Unable to retrieve feature from Redis") .withCause(e) .asRuntimeException(); + } finally { + sendMultiGetTimer.observeDuration(); } } } diff --git a/serving/src/main/java/feast/serving/util/Metrics.java b/serving/src/main/java/feast/serving/util/Metrics.java new file mode 100644 index 00000000000..a4463cf6897 --- /dev/null +++ b/serving/src/main/java/feast/serving/util/Metrics.java @@ -0,0 +1,37 @@ +package feast.serving.util; + +import io.prometheus.client.Counter; +import io.prometheus.client.Histogram; +import io.prometheus.client.Summary; + +public class Metrics { + + public static final Histogram requestLatency = Histogram.build() + .buckets(2, 4, 6, 8, 10, 15, 20, 25, 30, 35, 50) + .name("request_latency_ms") + .subsystem("feast_serving") + .help("Request latency in milliseconds.") + .labelNames("method") + .register(); + + public static final Counter requestCount = Counter.build() + .name("request_feature_count") + .subsystem("feast_serving") + .help("number of feature rows requested") + .labelNames("feature_set_name") + .register(); + + public static final Counter missingKeyCount = Counter.build() + .name("missing_feature_count") + .subsystem("feast_serving") + .help("number requested feature rows that were not found") + .labelNames("feature_set_name") + .register(); + + public static final Counter staleKeyCount = Counter.build() + .name("stale_feature_count") + .subsystem("feast_serving") + .help("number requested feature rows that were stale") + .labelNames("feature_set_name") + .register(); +} diff --git a/serving/src/main/resources/application.yml b/serving/src/main/resources/application.yml index 6ef68d710cf..95d3a3e9c41 100644 --- a/serving/src/main/resources/application.yml +++ b/serving/src/main/resources/application.yml @@ -55,6 +55,6 @@ grpc: server: # The port number on which the Tomcat webserver that serves REST API endpoints should listen - # It is set by default to 8080 so it does not conflict with Tomcat webserver on Feast Core + # It is set by default to 8081 so it does not conflict with Tomcat webserver on Feast Core # if both Feast Core and Serving are running on the same machine port: ${SERVER_PORT:8081} \ No newline at end of file From c7d9fac2a5e6a2465852ad22601509953226d3ca Mon Sep 17 00:00:00 2001 From: zhilingc Date: Mon, 25 Nov 2019 13:26:31 +0800 Subject: [PATCH 6/7] Update charts to 0.3.1 --- infra/charts/feast/Chart.yaml | 2 +- infra/charts/feast/charts/feast-core/Chart.yaml | 2 +- infra/charts/feast/charts/feast-core/values.yaml | 2 +- infra/charts/feast/charts/feast-serving/Chart.yaml | 2 +- infra/charts/feast/charts/feast-serving/values.yaml | 2 +- infra/charts/feast/requirements.lock | 10 +++++----- infra/charts/feast/requirements.yaml | 6 +++--- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/infra/charts/feast/Chart.yaml b/infra/charts/feast/Chart.yaml index a0ae8672390..23659cbb031 100644 --- a/infra/charts/feast/Chart.yaml +++ b/infra/charts/feast/Chart.yaml @@ -1,4 +1,4 @@ apiVersion: v1 description: A Helm chart to install Feast on kubernetes name: feast -version: 0.3.0 +version: 0.3.1 diff --git a/infra/charts/feast/charts/feast-core/Chart.yaml b/infra/charts/feast/charts/feast-core/Chart.yaml index 862095510b0..e281eb46c25 100644 --- a/infra/charts/feast/charts/feast-core/Chart.yaml +++ b/infra/charts/feast/charts/feast-core/Chart.yaml @@ -1,4 +1,4 @@ apiVersion: v1 description: A Helm chart for core component of Feast name: feast-core -version: 0.3.0 +version: 0.3.1 diff --git a/infra/charts/feast/charts/feast-core/values.yaml b/infra/charts/feast/charts/feast-core/values.yaml index db1f2f5bbd5..ae53ef55c38 100644 --- a/infra/charts/feast/charts/feast-core/values.yaml +++ b/infra/charts/feast/charts/feast-core/values.yaml @@ -42,7 +42,7 @@ replicaCount: 1 # image configures the Docker image for Feast Core image: repository: gcr.io/kf-feast/feast-core - tag: 0.3.0 + tag: 0.3.1 pullPolicy: IfNotPresent # application.yaml is the main configuration for Feast Core application. diff --git a/infra/charts/feast/charts/feast-serving/Chart.yaml b/infra/charts/feast/charts/feast-serving/Chart.yaml index cdce42c900e..ec6ad42c9e3 100644 --- a/infra/charts/feast/charts/feast-serving/Chart.yaml +++ b/infra/charts/feast/charts/feast-serving/Chart.yaml @@ -1,4 +1,4 @@ apiVersion: v1 description: A Helm chart for serving component of Feast name: feast-serving -version: 0.3.0 +version: 0.3.1 diff --git a/infra/charts/feast/charts/feast-serving/values.yaml b/infra/charts/feast/charts/feast-serving/values.yaml index 8f109a09059..d8d34dd0029 100644 --- a/infra/charts/feast/charts/feast-serving/values.yaml +++ b/infra/charts/feast/charts/feast-serving/values.yaml @@ -29,7 +29,7 @@ replicaCount: 1 # image configures the Docker image for Feast Serving image: repository: gcr.io/kf-feast/feast-serving - tag: 0.3.0 + tag: 0.3.1 pullPolicy: IfNotPresent # application.yaml is the main configuration for Feast Serving application. diff --git a/infra/charts/feast/requirements.lock b/infra/charts/feast/requirements.lock index 38305f47fdc..1496c931753 100644 --- a/infra/charts/feast/requirements.lock +++ b/infra/charts/feast/requirements.lock @@ -1,12 +1,12 @@ dependencies: - name: feast-core repository: "" - version: 0.3.0 + version: 0.3.1 - name: feast-serving repository: "" - version: 0.3.0 + version: 0.3.1 - name: feast-serving repository: "" - version: 0.3.0 -digest: sha256:36d703bde61d079ca80738e820840f28d6dd8408b296942d5a3e4767d12378f7 -generated: "2019-11-18T11:26:02.622058+08:00" + version: 0.3.1 +digest: sha256:5ba127fd17eb539719742a98ca43878ef6ccff4571850c0b744fe636a53a3d97 +generated: "2019-11-25T13:09:33.183038+08:00" diff --git a/infra/charts/feast/requirements.yaml b/infra/charts/feast/requirements.yaml index e4bf9044e5f..7069476cad9 100644 --- a/infra/charts/feast/requirements.yaml +++ b/infra/charts/feast/requirements.yaml @@ -1,12 +1,12 @@ dependencies: - name: feast-core - version: 0.3.0 + version: 0.3.1 condition: feast-core.enabled - name: feast-serving alias: feast-serving-batch - version: 0.3.0 + version: 0.3.1 condition: feast-serving-batch.enabled - name: feast-serving alias: feast-serving-online - version: 0.3.0 + version: 0.3.1 condition: feast-serving-online.enabled From cdd64e556bb7457f1777cfe4e3cf4ac0b9c8eab2 Mon Sep 17 00:00:00 2001 From: zhilingc Date: Mon, 25 Nov 2019 15:54:15 +0800 Subject: [PATCH 7/7] Enable http webservice for serving --- infra/charts/feast/charts/feast-serving/values.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/infra/charts/feast/charts/feast-serving/values.yaml b/infra/charts/feast/charts/feast-serving/values.yaml index d8d34dd0029..fa5746a65a2 100644 --- a/infra/charts/feast/charts/feast-serving/values.yaml +++ b/infra/charts/feast/charts/feast-serving/values.yaml @@ -65,9 +65,6 @@ application.yaml: enable-reflection: true server: port: 8080 - spring: - main: - web-application-type: none # store.yaml is the configuration for Feast Store. #