diff --git a/app/models/clusters/applications/knative.rb b/app/models/clusters/applications/knative.rb
index 89ffb72a22f890551d2f41013231723b02e8a2e9..387503bee540d1f651d2dcfcf95c4f5c04e1fae4 100644
--- a/app/models/clusters/applications/knative.rb
+++ b/app/models/clusters/applications/knative.rb
@@ -3,7 +3,7 @@
 module Clusters
   module Applications
     class Knative < ApplicationRecord
-      VERSION = '0.7.0'
+      VERSION = '0.9.0'
       REPOSITORY = 'https://storage.googleapis.com/triggermesh-charts'
       METRICS_CONFIG = 'https://storage.googleapis.com/triggermesh-charts/istio-metrics.yaml'
       FETCH_IP_ADDRESS_DELAY = 30.seconds
diff --git a/changelogs/unreleased/knative-0-9-update.yml b/changelogs/unreleased/knative-0-9-update.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d25e9e90efe6caf348a53f43cba642694ef11676
--- /dev/null
+++ b/changelogs/unreleased/knative-0-9-update.yml
@@ -0,0 +1,5 @@
+---
+title: Update Knative to 0.9.0
+merge_request: 21361
+author: cab105
+type: added
diff --git a/config/prometheus/common_metrics.yml b/config/prometheus/common_metrics.yml
index 795243fab49d589ce6ec0da55d8d362305ed77bd..314ee44ed71730c30e8d5d31c40677ebd99a1361 100644
--- a/config/prometheus/common_metrics.yml
+++ b/config/prometheus/common_metrics.yml
@@ -209,6 +209,6 @@ panel_groups:
     weight: 1
     metrics:
     - id: system_metrics_knative_function_invocation_count
-      query_range: 'sum(ceil(rate(istio_requests_total{destination_service_namespace="%{kube_namespace}", destination_app=~"%{function_name}.*"}[1m])*60))'
+      query_range: 'sum(ceil(rate(istio_requests_total{destination_service_namespace="%{kube_namespace}", destination_service=~"%{function_name}.*"}[1m])*60))'
       label: invocations / minute
       unit: requests
diff --git a/db/post_migrate/20191209215316_knative_0_9_prometheus_update.rb b/db/post_migrate/20191209215316_knative_0_9_prometheus_update.rb
new file mode 100644
index 0000000000000000000000000000000000000000..52127f71cd089bf0266b2520f1e35562dae34782
--- /dev/null
+++ b/db/post_migrate/20191209215316_knative_0_9_prometheus_update.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class Knative09PrometheusUpdate < ActiveRecord::Migration[5.2]
+  DOWNTIME = false
+
+  def up
+    ::Gitlab::DatabaseImporters::CommonMetrics::Importer.new.execute
+  end
+
+  def down
+    # no-op
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index d3e9f66c3880ea8919239c1df87210cb6e100531..352dea7e1b5a82eae16e1c5a19556f6268d9d38a 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2019_12_16_183532) do
+ActiveRecord::Schema.define(version: 2019_12_17_160632) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "pg_trgm"
diff --git a/spec/controllers/projects/serverless/functions_controller_spec.rb b/spec/controllers/projects/serverless/functions_controller_spec.rb
index 73fb0fad646a15f975af8d654909386c17a3addd..33d66f4ac5ac4c48ec5f99a4d3a79785226c154e 100644
--- a/spec/controllers/projects/serverless/functions_controller_spec.rb
+++ b/spec/controllers/projects/serverless/functions_controller_spec.rb
@@ -149,6 +149,14 @@ def params(opts = {})
 
         include_examples 'GET #show with valid data'
       end
+
+      context 'on Knative 0.9.0' do
+        before do
+          prepare_knative_stubs(knative_09_service(knative_stub_options))
+        end
+
+        include_examples 'GET #show with valid data'
+      end
     end
   end
 
@@ -210,6 +218,14 @@ def params(opts = {})
 
       include_examples 'GET #index with data'
     end
+
+    context 'on Knative 0.9.0' do
+      before do
+        prepare_knative_stubs(knative_09_service(knative_stub_options))
+      end
+
+      include_examples 'GET #index with data'
+    end
   end
 
   def prepare_knative_stubs(knative_service)
diff --git a/spec/lib/gitlab/prometheus/queries/knative_invocation_query_spec.rb b/spec/lib/gitlab/prometheus/queries/knative_invocation_query_spec.rb
index 0936d89545319633eadd20a097c6db3f7b3753a0..fa2dccc7c92d51460e582895ed983e6722c5d4e3 100644
--- a/spec/lib/gitlab/prometheus/queries/knative_invocation_query_spec.rb
+++ b/spec/lib/gitlab/prometheus/queries/knative_invocation_query_spec.rb
@@ -16,12 +16,12 @@
       create(:prometheus_metric,
              :common,
              identifier: :system_metrics_knative_function_invocation_count,
-             query: 'sum(ceil(rate(istio_requests_total{destination_service_namespace="%{kube_namespace}", destination_app=~"%{function_name}.*"}[1m])*60))')
+             query: 'sum(ceil(rate(istio_requests_total{destination_service_namespace="%{kube_namespace}", destination_service=~"%{function_name}.*"}[1m])*60))')
     end
 
     it 'has the query, but no data' do
       expect(client).to receive(:query_range).with(
-        'sum(ceil(rate(istio_requests_total{destination_service_namespace="test-ns", destination_app=~"test-name.*"}[1m])*60))',
+        'sum(ceil(rate(istio_requests_total{destination_service_namespace="test-ns", destination_service=~"test-name.*"}[1m])*60))',
         hash_including(:start, :stop)
       )
 
diff --git a/spec/models/clusters/applications/knative_spec.rb b/spec/models/clusters/applications/knative_spec.rb
index 5b45dc078de66c2c1f21754f928f242c8dffbe96..c1057af5f80a87cddae8f0352faca38b127c3cc9 100644
--- a/spec/models/clusters/applications/knative_spec.rb
+++ b/spec/models/clusters/applications/knative_spec.rb
@@ -123,7 +123,7 @@
     subject { knative.install_command }
 
     it 'is initialized with latest version' do
-      expect(subject.version).to eq('0.7.0')
+      expect(subject.version).to eq('0.9.0')
     end
 
     it_behaves_like 'a command'
diff --git a/spec/support/helpers/kubernetes_helpers.rb b/spec/support/helpers/kubernetes_helpers.rb
index a3b527e0ffe3d1e6a4290b5e91690cd54ac21d21..ad4ae93a02792354b0dc87a400d160cef4a8e3d0 100644
--- a/spec/support/helpers/kubernetes_helpers.rb
+++ b/spec/support/helpers/kubernetes_helpers.rb
@@ -351,7 +351,7 @@ def kube_knative_pods_body(name, namespace)
   def kube_knative_services_body(**options)
     {
       "kind" => "List",
-      "items" => [knative_07_service(options)]
+      "items" => [knative_09_service(options)]
     }
   end
 
@@ -539,6 +539,58 @@ def knative_07_service(name: 'kubetest', namespace: 'default', domain: 'example.
       "podcount" => 0 }
   end
 
+  # noinspection RubyStringKeysInHashInspection
+  def knative_09_service(name: 'kubetest', namespace: 'default', domain: 'example.com', description: 'a knative service', environment: 'production')
+    { "apiVersion" => "serving.knative.dev/v1alpha1",
+      "kind" => "Service",
+      "metadata" =>
+        { "annotations" =>
+            { "serving.knative.dev/creator" => "system:serviceaccount:#{namespace}:#{namespace}-service-account",
+              "serving.knative.dev/lastModifier" => "system:serviceaccount:#{namespace}:#{namespace}-service-account" },
+          "creationTimestamp" => "2019-10-22T21:19:13Z",
+          "generation" => 1,
+          "labels" => { "service" => name },
+          "name" => name,
+          "namespace" => namespace,
+          "resourceVersion" => "289726",
+          "selfLink" => "/apis/serving.knative.dev/v1alpha1/namespaces/#{namespace}/services/#{name}",
+          "uid" => "988349fa-f511-11e9-9ea1-42010a80005e" },
+      "spec" => {
+        "template" => {
+          "metadata" => {
+            "annotations" => { "Description" => description },
+            "creationTimestamp" => "2019-10-22T21:19:12Z",
+            "labels" => { "service" => name }
+          },
+          "spec" => {
+            "containers" => [{
+                               "env" =>
+                                 [{ "name" => "timestamp", "value" => "2019-10-22 21:19:12" }],
+                               "image" => "image_name",
+                               "name" => "user-container",
+                               "resources" => {}
+                             }],
+            "timeoutSeconds" => 300
+          }
+        },
+        "traffic" => [{ "latestRevision" => true, "percent" => 100 }]
+      },
+      "status" =>
+        { "address" => { "url" => "http://#{name}.#{namespace}.svc.cluster.local" },
+          "conditions" =>
+            [{ "lastTransitionTime" => "2019-10-22T21:20:15Z", "status" => "True", "type" => "ConfigurationsReady" },
+             { "lastTransitionTime" => "2019-10-22T21:20:15Z", "status" => "True", "type" => "Ready" },
+             { "lastTransitionTime" => "2019-10-22T21:20:15Z", "status" => "True", "type" => "RoutesReady" }],
+          "latestCreatedRevisionName" => "#{name}-92tsj",
+          "latestReadyRevisionName" => "#{name}-92tsj",
+          "observedGeneration" => 1,
+          "traffic" => [{ "latestRevision" => true, "percent" => 100, "revisionName" => "#{name}-92tsj" }],
+          "url" => "http://#{name}.#{namespace}.#{domain}" },
+      "environment_scope" => environment,
+      "cluster_id" => 5,
+      "podcount" => 0 }
+  end
+
   # noinspection RubyStringKeysInHashInspection
   def knative_05_service(name: 'kubetest', namespace: 'default', domain: 'example.com', description: 'a knative service', environment: 'production')
     { "apiVersion" => "serving.knative.dev/v1alpha1",