Repository: firecracker-microvm/firecracker-containerd
Pull request #604 (2022-04-08 18:36:19)

Upgrade to containerd 1.6.3 (CVE-2022-24778)
containerd/imgcrypt 1.1.4 patches CVE-2022-24778:

* https://nvd.nist.gov/vuln/detail/CVE-2022-24778
* https://github.com/containerd/imgcrypt/commit/6fdd9818a4d8142107b7ecd767d839c9707700d9

We had a dependabot alert that was unable to automatically create a PR
to address this: https://github.com/firecracker-microvm/firecracker-containerd/security/dependabot/6

```
go get github.com/containerd/imgrypt
go mod tidy
```

Signed-off-by: Gavin Inglis <giinglis@amazon.com>

*Issue #, if available:*

*Description of changes:*


By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.


ginglis13: Hmm... looks like there's some extra effort needed here with this upgrade:

> undefined: v1.MediaTypeImageLayerZstd

https://buildkite.com/firecracker-microvm/firecracker-containerd-al2/builds/1224#0b38310f-36ae-4284-8b20-43bd0a2c244f
kzys: Do you know the reason we have imgcrypt? Can you update the packages that brings imgcrypt in first? 
ginglis13: > Do you know the reason we have imgcrypt? Can you update the packages that brings imgcrypt in first?

sure I will take a look. I realize now this PR is attempting to pull in imgcrypt as a direct dependency whereas before it was indirectly imported 😅
ginglis13: here's where imgcrypt is an indirect dependency, mainly from containerd 1.6.1:

```bash
$ go mod graph | grep imgcrypt

github.com/containerd/containerd@v1.6.1 github.com/containerd/imgcrypt@v1.1.3
...
github.com/containerd/containerd@v1.5.7 github.com/containerd/imgcrypt@v1.1.1
github.com/containerd/containerd@v1.5.0-beta.3 github.com/containerd/imgcrypt@v1.0.4-0.20210301171431-0ae5c75f59ba
github.com/containerd/containerd@v1.5.8 github.com/containerd/imgcrypt@v1.1.1
github.com/containerd/containerd@v1.5.1 github.com/containerd/imgcrypt@v1.1.1
...
github.com/containerd/containerd@v1.5.0-rc.0 github.com/containerd/imgcrypt@v1.1.1-0.20210312161619-7ed62a527887
github.com/containerd/containerd@v1.5.0-beta.1 github.com/containerd/imgcrypt@v1.0.1
github.com/containerd/containerd@v1.5.0-beta.4 github.com/containerd/imgcrypt@v1.1.1-0.20210312161619-7ed62a527887
```

in that case, should we wait until newer containerd version that includes imgcrypt@v1.1.4 ?
kzys: You could consume the tip of release/1.6. There are a few other fixes in the branch already.
kzys: We can use containerd 1.6.3 now.
ginglis13: > We can use containerd 1.6.3 now.

👍 I'll update this PR to upgrade containerd to 1.6.3

Patch:
diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml
index a4dda37..fab4426 100644
--- a/.buildkite/pipeline.yml
+++ b/.buildkite/pipeline.yml
@@ -85,12 +85,13 @@ steps:
     env:
       DOCKER_IMAGE_TAG: "$BUILDKITE_BUILD_NUMBER"
       NUMBER_OF_VMS: 100
-      EXTRAGOARGS: "-v -count=1 -race -timeout=1h"
+      EXTRAGOARGS: "-v -count=1 -race"
       FICD_DM_VOLUME_GROUP: fcci-vg
     artifact_paths:
       - "runtime/logs/*"
     command:
       - make -C runtime integ-test FICD_DM_POOL=build_${BUILDKITE_BUILD_NUMBER}_runtime
+    timeout_in_minutes: 30
 
   - label: ":rotating_light: :exclamation: example tests"
     agents:
@@ -99,7 +100,7 @@ steps:
       hostname: "${BUILDKITE_AGENT_META_DATA_HOSTNAME}"
     env:
       DOCKER_IMAGE_TAG: "$BUILDKITE_BUILD_NUMBER"
-      EXTRAGOARGS: "-v -count=1 -race"
+      EXTRAGOARGS: "-v -count=1 -timeout=1h"
       FICD_DM_VOLUME_GROUP: fcci-vg
     artifact_paths:
       - "examples/logs/*"
diff --git a/Makefile b/Makefile
index 4b5bd86..65afcbd 100644
--- a/Makefile
+++ b/Makefile
@@ -294,12 +294,12 @@ install-test-cni-bins: test-cni-bins $(CNI_BIN_ROOT)
 	install -D -o root -g root -m755 -t $(CNI_BIN_ROOT) $(TEST_BRIDGED_TAP_BIN)
 
 FCNET_CONFIG?=/etc/cni/conf.d/fcnet.conflist
-$(FCNET_CONFIG): tools/demo/fcnet.conflist
+$(FCNET_CONFIG):
 	mkdir -p $(dir $(FCNET_CONFIG))
 	install -o root -g root -m644 tools/demo/fcnet.conflist $(FCNET_CONFIG)
 
 FCNET_BRIDGE_CONFIG?=/etc/network/interfaces.d/fc-br0
-$(FCNET_BRIDGE_CONFIG): tools/demo/fc-br0.interface
+$(FCNET_BRIDGE_CONFIG):
 	mkdir -p $(dir $(FCNET_BRIDGE_CONFIG))
 	install -o root -g root -m644 tools/demo/fc-br0.interface $(FCNET_BRIDGE_CONFIG)
 
diff --git a/examples/Makefile b/examples/Makefile
index 560eece..340b7f4 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -52,7 +52,7 @@ TEST_GATEWAY?=172.16.0.1
 TEST_IP?=172.16.0.2
 TEST_SUBNET?=/24
 FICD_DM_VOLUME_GROUP?=
-TEST_POOL?=fc-test-thinpool
+TEST_POOL?=testpool
 testtap:
 	ip link add br0 type bridge
 	ip tuntap add tap0 mode tap
diff --git a/go.mod b/go.mod
index 8f72787..3ea3ad5 100644
--- a/go.mod
+++ b/go.mod
@@ -5,22 +5,22 @@ go 1.16
 require (
 	github.com/StackExchange/wmi v0.0.0-20181212234831-e0a55b97c705 // indirect
 	github.com/awslabs/tc-redirect-tap v0.0.0-20211025175357-e30dfca224c2
-	github.com/containerd/containerd v1.6.1
+	github.com/containerd/containerd v1.6.3
 	github.com/containerd/continuity v0.2.2
 	github.com/containerd/fifo v1.0.0
 	github.com/containerd/go-runc v1.0.0
 	github.com/containerd/ttrpc v1.1.0
 	github.com/containerd/typeurl v1.0.2
 	github.com/containernetworking/cni v1.0.1
-	github.com/containernetworking/plugins v1.0.1
+	github.com/containernetworking/plugins v1.1.1
 	github.com/firecracker-microvm/firecracker-go-sdk v0.22.1-0.20220302172044-565c88a871e2
 	github.com/go-ole/go-ole v1.2.4 // indirect
 	github.com/gofrs/uuid v3.3.0+incompatible
 	github.com/gogo/protobuf v1.3.2
 	github.com/hashicorp/go-multierror v1.1.1
 	github.com/miekg/dns v1.1.25
-	github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5
-	github.com/opencontainers/runc v1.1.0
+	github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799
+	github.com/opencontainers/runc v1.1.1
 	github.com/opencontainers/runtime-spec v1.0.3-0.20210910115017-0d6cc581aeea
 	github.com/pelletier/go-toml v1.9.3
 	github.com/pkg/errors v0.9.1
diff --git a/go.sum b/go.sum
index 428a30a..99543c8 100644
--- a/go.sum
+++ b/go.sum
@@ -201,8 +201,9 @@ github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoT
 github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g=
 github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c=
 github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s=
-github.com/containerd/containerd v1.6.1 h1:oa2uY0/0G+JX4X7hpGCYvkp9FjUancz56kSNnb1sG3o=
 github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE=
+github.com/containerd/containerd v1.6.3 h1:JfgUEIAH07xDWk6kqz0P3ArZt+KJ9YeihSC9uyFtSKg=
+github.com/containerd/containerd v1.6.3/go.mod h1:gCVGrYRYFm2E8GmuUIbj/NGD7DLZQLzSJQazjVKDOig=
 github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
 github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
 github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
@@ -222,8 +223,9 @@ github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O1
 github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU=
 github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk=
 github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA=
-github.com/containerd/go-cni v1.1.3 h1:t0MQwrtM96SH71Md8tH0uKrVE9v+jxkDTbvFSm3B9VE=
 github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA=
+github.com/containerd/go-cni v1.1.4 h1:Mv3XkOjVsjTJHMpSi+dKZQPQGXEMpmXWs8oYZDaCK+s=
+github.com/containerd/go-cni v1.1.4/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA=
 github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
 github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
 github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g=
@@ -234,8 +236,9 @@ github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak
 github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA=
 github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow=
 github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms=
-github.com/containerd/imgcrypt v1.1.3 h1:69UKRsA3Q/lAwo2eDzWshdjimqhmprrWXfNtBeO0fBc=
 github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4=
+github.com/containerd/imgcrypt v1.1.4 h1:iKTstFebwy3Ak5UF0RHSeuCTahC5OIrPJa6vjMAM81s=
+github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo=
 github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c=
 github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY=
 github.com/containerd/nri v0.1.0 h1:6QioHRlThlKh2RkRTR4kIT3PKAcrLo3gIWnjkM4dQmQ=
@@ -265,13 +268,15 @@ github.com/containernetworking/cni v1.0.1 h1:9OIL/sZmMYDBe+G8svzILAlulUpaDTUjeAb
 github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y=
 github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM=
 github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8=
-github.com/containernetworking/plugins v1.0.1 h1:wwCfYbTCj5FC0EJgyzyjTXmqysOiJE9r712Z+2KVZAk=
 github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE=
+github.com/containernetworking/plugins v1.1.1 h1:+AGfFigZ5TiQH00vhR8qPeSatj53eNGz0C1d3wVYlHE=
+github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8=
 github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc=
 github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4=
 github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY=
-github.com/containers/ocicrypt v1.1.2 h1:Ez+GAMP/4GLix5Ywo/fL7O0nY771gsBIigiqUm1aXz0=
 github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY=
+github.com/containers/ocicrypt v1.1.3 h1:uMxn2wTb4nDR7GqG3rnZSfpJXqWURfzZ7nKydzIeKpA=
+github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g=
 github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
 github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
@@ -681,8 +686,9 @@ github.com/mdlayher/vsock v1.1.1/go.mod h1:Y43jzcy7KM3QB+/FK15pfqGxDMCMzUXWegEfI
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 github.com/miekg/dns v1.1.25 h1:dFwPR6SfLtrSwgDcIq2bcU/gVutB4sNApq2HBdqcakg=
 github.com/miekg/dns v1.1.25/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
-github.com/miekg/pkcs11 v1.0.3 h1:iMwmD7I5225wv84WxIG/bmxz9AXjWvTWIbM/TYHvWtw=
 github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
+github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU=
+github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
 github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
 github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
 github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
@@ -728,6 +734,7 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW
 github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
 github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
+github.com/networkplumbing/go-nft v0.2.0/go.mod h1:HnnM+tYvlGAsMU7yoYwXEVLLiDW9gdMmb5HoGcwpuQs=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
@@ -766,16 +773,19 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8
 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
 github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
 github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
-github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5 h1:q37d91F6BO4Jp1UqWiun0dUFYaqv6WsKTLTCaWv+8LY=
 github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
+github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
+github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec=
+github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
 github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0=
 github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0=
-github.com/opencontainers/runc v1.1.0 h1:O9+X96OcDjkmmZyfaG996kV7yq8HsoU2h1XRRQcefG8=
 github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc=
+github.com/opencontainers/runc v1.1.1 h1:PJ9DSs2sVwE0iVr++pAHE6QkS9tzcVWozlPifdwMgrU=
+github.com/opencontainers/runc v1.1.1/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc=
 github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
@@ -815,8 +825,9 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
 github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
 github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
-github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ=
 github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s=
+github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
 github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -1359,6 +1370,7 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
 golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/snapshotter/app/service.go b/snapshotter/app/service.go
index 50dc681..8dac1ed 100644
--- a/snapshotter/app/service.go
+++ b/snapshotter/app/service.go
@@ -20,7 +20,6 @@ import (
 	"os"
 	"os/signal"
 	"strconv"
-	"strings"
 	"syscall"
 
 	snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
@@ -35,8 +34,6 @@ import (
 	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/config"
 	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux"
 	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/cache"
-	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/metrics"
-	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/metrics/discovery"
 	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/proxy"
 	proxyaddress "github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/proxy/address"
 )
@@ -54,8 +51,7 @@ func Run(config config.Config) error {
 
 	group, ctx := errgroup.WithContext(ctx)
 
-	cache := cache.NewSnapshotterCache()
-	snapshotter, err := initSnapshotter(ctx, config, cache)
+	snapshotter, err := initSnapshotter(ctx, config)
 	if err != nil {
 		log.G(ctx).WithFields(
 			logrus.Fields{"resolver": config.Snapshotter.Proxy.Address.Resolver.Type},
@@ -79,15 +75,6 @@ func Run(config config.Config) error {
 		return err
 	}
 
-	var serviceDiscovery *discovery.ServiceDiscovery
-	if config.Snapshotter.Metrics.Enable {
-		sdPort := config.Snapshotter.Metrics.ServiceDiscoveryPort
-		serviceDiscovery = discovery.NewServiceDiscovery(config.Snapshotter.Metrics.Host, sdPort, cache)
-		group.Go(func() error {
-			return serviceDiscovery.Serve()
-		})
-	}
-
 	group.Go(func() error {
 		return grpcServer.Serve(listener)
 	})
@@ -100,11 +87,6 @@ func Run(config config.Config) error {
 			if err := snapshotter.Close(); err != nil {
 				log.G(ctx).WithError(err).Error("failed to close snapshotter")
 			}
-			if serviceDiscovery != nil {
-				if err := serviceDiscovery.Shutdown(ctx); err != nil {
-					log.G(ctx).WithError(err).Error("failed to shutdown service discovery server")
-				}
-			}
 		}()
 
 		for {
@@ -140,79 +122,31 @@ func initResolver(config config.Config) (proxyaddress.Resolver, error) {
 const base10 = 10
 const bits32 = 32
 
-func initSnapshotter(ctx context.Context, config config.Config, cache cache.Cache) (snapshots.Snapshotter, error) {
+func initSnapshotter(ctx context.Context, config config.Config) (snapshots.Snapshotter, error) {
 	resolver, err := initResolver(config)
 	if err != nil {
 		return nil, err
 	}
 
-	newProxySnapshotterFunc := func(ctx context.Context, namespace string) (*proxy.RemoteSnapshotter, error) {
+	newProxySnapshotterFunc := func(ctx context.Context, namespace string) (snapshots.Snapshotter, error) {
 		r := resolver
 		response, err := r.Get(namespace)
 		if err != nil {
 			return nil, err
 		}
-		host := response.Address
-		port, err := strconv.ParseUint(response.SnapshotterPort, base10, bits32)
+		host, portstr, err := net.SplitHostPort(response.Address)
+		if err != nil {
+			return nil, err
+		}
+		port, err := strconv.ParseUint(portstr, base10, bits32)
 		if err != nil {
 			return nil, err
 		}
 		snapshotterDialer := func(ctx context.Context, namespace string) (net.Conn, error) {
 			return vsock.DialContext(ctx, host, uint32(port), vsock.WithLogger(log.G(ctx)))
 		}
-
-		var metricsProxy *metrics.Proxy
-		// TODO (ginglis13): port management and lifecycle ties in to overall metrics proxy
-		// server lifecycle. tracked here: https://github.com/firecracker-microvm/firecracker-containerd/issues/607
-		portMap := make(map[int]bool)
-		if config.Snapshotter.Metrics.Enable {
-			metricsPort, err := strconv.ParseUint(response.MetricsPort, base10, bits32)
-			if err != nil {
-				return nil, err
-			}
-
-			metricsDialer := func(ctx context.Context, _, _ string) (net.Conn, error) {
-				return vsock.DialContext(ctx, host, uint32(metricsPort), vsock.WithLogger(log.G(ctx)))
-			}
-
-			portRange := config.Snapshotter.Metrics.PortRange
-			metricsHost := config.Snapshotter.Metrics.Host
-
-			// Assign a port for metrics proxy server.
-			ports := strings.Split(portRange, "-")
-			portRangeError := fmt.Errorf("invalid port range %s", portRange)
-			if len(ports) < 2 {
-				return nil, portRangeError
-			}
-			lower, err := strconv.Atoi(ports[0])
-			if err != nil {
-				return nil, portRangeError
-			}
-			upper, err := strconv.Atoi(ports[1])
-			if err != nil {
-				return nil, portRangeError
-			}
-			port := -1
-			for p := lower; p <= upper; p++ {
-				if _, ok := portMap[p]; !ok {
-					port = p
-					portMap[p] = true
-					break
-				}
-			}
-			if port < 0 {
-				return nil, fmt.Errorf("invalid port: %d", port)
-			}
-
-			metricsProxy, err = metrics.NewProxy(metricsHost, port, response.Labels, metricsDialer)
-			if err != nil {
-				return nil, err
-			}
-
-		}
-
-		return proxy.NewProxySnapshotter(ctx, host, snapshotterDialer, metricsProxy)
+		return proxy.NewProxySnapshotter(ctx, host, snapshotterDialer)
 	}
 
-	return demux.NewSnapshotter(cache, newProxySnapshotterFunc), nil
+	return demux.NewSnapshotter(cache.NewSnapshotterCache(), newProxySnapshotterFunc), nil
 }
diff --git a/snapshotter/config/config.go b/snapshotter/config/config.go
index 3b42b0f..9cac4e7 100644
--- a/snapshotter/config/config.go
+++ b/snapshotter/config/config.go
@@ -33,7 +33,6 @@ type Config struct {
 type snapshotter struct {
 	Listener listener `toml:"listener"`
 	Proxy    proxy    `toml:"proxy"`
-	Metrics  metrics  `toml:"metrics"`
 }
 
 type listener struct {
@@ -58,13 +57,6 @@ type debug struct {
 	LogLevel string `toml:"logLevel" default:"info"`
 }
 
-type metrics struct {
-	Enable               bool   `toml:"enable" default:"false"`
-	Host                 string `toml:"host"`
-	PortRange            string `toml:"port_range"`
-	ServiceDiscoveryPort int    `toml:"service_discovery_port"`
-}
-
 // Load parses application configuration from a specified file path.
 func Load(filePath string) (Config, error) {
 	file, err := os.Open(filePath)
diff --git a/snapshotter/config/config.toml.example b/snapshotter/config/config.toml.example
index 4abd0f8..792651f 100644
--- a/snapshotter/config/config.toml.example
+++ b/snapshotter/config/config.toml.example
@@ -6,12 +6,5 @@
   type = "http"
   address = "127.0.0.1:10001"
 
-[snapshotter.metrics]
-  enable = true
-  port_range = "9000-9999"
-  [snapshotter.metrics.service_discovery]
-    enable = true
-    port = 8080
-
 [debug]
   logLevel = "info"
diff --git a/snapshotter/demux/cache/cache.go b/snapshotter/demux/cache/cache.go
index 1250144..4b811e6 100644
--- a/snapshotter/demux/cache/cache.go
+++ b/snapshotter/demux/cache/cache.go
@@ -16,17 +16,17 @@ package cache
 import (
 	"context"
 
-	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/proxy"
+	"github.com/containerd/containerd/snapshots"
 )
 
 // SnapshotterProvider defines a snapshotter fetch function.
-type SnapshotterProvider = func(context.Context, string) (*proxy.RemoteSnapshotter, error)
+type SnapshotterProvider = func(context.Context, string) (snapshots.Snapshotter, error)
 
 // Cache defines the interface for a snapshotter caching mechanism.
 type Cache interface {
 	// Retrieves the snapshotter from the underlying cache using the provided
 	// fetch function if the snapshotter is not currently cached.
-	Get(ctx context.Context, key string, fetch SnapshotterProvider) (*proxy.RemoteSnapshotter, error)
+	Get(ctx context.Context, key string, fetch SnapshotterProvider) (snapshots.Snapshotter, error)
 
 	// Closes the snapshotter and removes it from the cache.
 	Evict(key string) error
diff --git a/snapshotter/demux/cache/snapshotter_cache.go b/snapshotter/demux/cache/snapshotter_cache.go
index 761cbf8..5f039a9 100644
--- a/snapshotter/demux/cache/snapshotter_cache.go
+++ b/snapshotter/demux/cache/snapshotter_cache.go
@@ -18,7 +18,7 @@ import (
 	"fmt"
 	"sync"
 
-	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/proxy"
+	"github.com/containerd/containerd/snapshots"
 	"github.com/hashicorp/go-multierror"
 )
 
@@ -26,16 +26,16 @@ import (
 // for keyed snapshotters.
 type SnapshotterCache struct {
 	mutex        *sync.RWMutex
-	snapshotters map[string]*proxy.RemoteSnapshotter
+	snapshotters map[string]snapshots.Snapshotter
 }
 
 // NewSnapshotterCache creates a new instance with an empty cache.
 func NewSnapshotterCache() *SnapshotterCache {
-	return &SnapshotterCache{&sync.RWMutex{}, make(map[string]*proxy.RemoteSnapshotter)}
+	return &SnapshotterCache{&sync.RWMutex{}, make(map[string]snapshots.Snapshotter)}
 }
 
 // Get fetches and caches the snapshotter for a given key.
-func (cache *SnapshotterCache) Get(ctx context.Context, key string, fetch SnapshotterProvider) (*proxy.RemoteSnapshotter, error) {
+func (cache *SnapshotterCache) Get(ctx context.Context, key string, fetch SnapshotterProvider) (snapshots.Snapshotter, error) {
 	snapshotter, ok := cache.snapshotters[key]
 
 	if !ok {
@@ -59,7 +59,7 @@ func (cache *SnapshotterCache) Get(ctx context.Context, key string, fetch Snapsh
 // Evict removes a cached snapshotter for a given key.
 func (cache *SnapshotterCache) Evict(key string) error {
 	cache.mutex.RLock()
-	remoteSnapshotter, ok := cache.snapshotters[key]
+	snapshotter, ok := cache.snapshotters[key]
 	cache.mutex.RUnlock()
 
 	if !ok {
@@ -68,7 +68,7 @@ func (cache *SnapshotterCache) Evict(key string) error {
 	cache.mutex.Lock()
 	defer cache.mutex.Unlock()
 
-	err := remoteSnapshotter.Close()
+	err := snapshotter.Close()
 	delete(cache.snapshotters, key)
 	return err
 }
@@ -76,8 +76,8 @@ func (cache *SnapshotterCache) Evict(key string) error {
 // Close calls Close on all cached remote snapshotters.
 func (cache *SnapshotterCache) Close() error {
 	var compiledErr error
-	for _, remoteSnapshotter := range cache.snapshotters {
-		if err := remoteSnapshotter.Close(); err != nil {
+	for _, snapshotter := range cache.snapshotters {
+		if err := snapshotter.Close(); err != nil {
 			compiledErr = multierror.Append(compiledErr, err)
 		}
 	}
diff --git a/snapshotter/demux/metrics/discovery/service_discovery.go b/snapshotter/demux/metrics/discovery/service_discovery.go
deleted file mode 100644
index 5cbd707..0000000
--- a/snapshotter/demux/metrics/discovery/service_discovery.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"). You may
-// not use this file except in compliance with the License. A copy of the
-// License is located at
-//
-//	http://aws.amazon.com/apache2.0/
-//
-// or in the "license" file accompanying this file. This file is distributed
-// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
-// express or implied. See the License for the specific language governing
-// permissions and limitations under the License.
-
-package discovery
-
-import (
-	"context"
-	"encoding/json"
-	"fmt"
-	"net/http"
-	"strconv"
-
-	"github.com/containerd/containerd/log"
-	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/cache"
-)
-
-// ServiceDiscovery discovers metrics services in the snapshotter cache
-// and serves a []MetricsTarget on an HTTP server.
-type ServiceDiscovery struct {
-	// cache is the shared host-level cache of snapshotters also used by the demux snapshotter.
-	cache cache.Cache
-	// server is the HTTP server that returns a list of targets to pull metrics from and apply labels to those metrics.
-	server *http.Server
-}
-
-// NewServiceDiscovery returns a ServiceDiscovery with configured HTTP server and provided cache.
-func NewServiceDiscovery(host string, port int, c cache.Cache) *ServiceDiscovery {
-	return &ServiceDiscovery{
-		server: &http.Server{
-			Addr: host + ":" + strconv.Itoa(port),
-		},
-		cache: c,
-	}
-}
-
-// Serve starts the HTTP server for receiving service discovery requests.
-func (sd *ServiceDiscovery) Serve() error {
-	sd.server.Handler = http.HandlerFunc(sd.serviceDiscoveryHandler)
-	err := sd.server.ListenAndServe()
-	if err != http.ErrServerClosed {
-		return err
-	}
-
-	return nil
-}
-
-// Shutdown shuts down the service discovery HTTP server.
-func (sd *ServiceDiscovery) Shutdown(ctx context.Context) error {
-	return sd.server.Shutdown(ctx)
-}
-
-// metricsTarget represents the underlying JSON structure
-// that a Prometheus HTTP Service Discovery server is
-// expected to return.
-//
-// https://prometheus.io/docs/prometheus/latest/http_sd/
-type metricsTarget struct {
-	Targets []string          `json:"targets"`
-	Labels  map[string]string `json:"labels"`
-}
-
-// serviceDiscoveryHandler scans the cache for snapshotters and their proxy server information,
-// and builds and returns a JSON response in the format of a Prometheus service discovery endpoint.
-func (sd *ServiceDiscovery) serviceDiscoveryHandler(w http.ResponseWriter, req *http.Request) {
-	ctx := req.Context()
-
-	namespaces := sd.cache.List()
-	services := []metricsTarget{}
-	for _, ns := range namespaces {
-		cachedSnapshotter, err := sd.cache.Get(ctx, ns, nil)
-		if err != nil {
-			log.G(ctx).Error("unable to retrieve from snapshotter cache: ", err)
-			continue
-		}
-
-		// make target "localhost:{PORT}" -> the metrics proxy for given snapshotter
-		targetString := fmt.Sprintf("localhost:%v", cachedSnapshotter.MetricsProxyPort())
-		target := []string{targetString}
-
-		// build list of discovered services
-		mt := metricsTarget{Targets: target, Labels: cachedSnapshotter.MetricsProxyLabels()}
-		services = append(services, mt)
-	}
-
-	w.Header().Set("Content-Type", "application/json")
-
-	response, err := json.Marshal(services)
-	if err != nil {
-		log.G(ctx).Error("unable to marshal service discovery response: ", err)
-		w.WriteHeader(500)
-		return
-	}
-
-	w.Write(response)
-}
diff --git a/snapshotter/demux/metrics/proxy.go b/snapshotter/demux/metrics/proxy.go
deleted file mode 100644
index c86398e..0000000
--- a/snapshotter/demux/metrics/proxy.go
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"). You may
-// not use this file except in compliance with the License. A copy of the
-// License is located at
-//
-//	http://aws.amazon.com/apache2.0/
-//
-// or in the "license" file accompanying this file. This file is distributed
-// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
-// express or implied. See the License for the specific language governing
-// permissions and limitations under the License.
-
-package metrics
-
-import (
-	"context"
-	"io"
-	"net"
-	"net/http"
-	"strconv"
-
-	"github.com/containerd/containerd/log"
-)
-
-const (
-	// RequestPath is the path in the microVM hosting remote snapshotter metrics.
-	RequestPath = "http://localhost/metrics"
-	// MaxMetricsResponseSize is the limit in bytes for size of a metrics response from a remote snapshotter.
-	MaxMetricsResponseSize = 32768 // 32 KB
-)
-
-// Proxy represents a metrics proxy server for getting and serving remote snapshotter metrics.
-type Proxy struct {
-	// client is the HTTP client used to send metrics requests to a remote snapshotter.
-	client *http.Client
-	// server is the proxy server on host for serving remote snapshotter metrics.
-	server *http.Server
-	// host is the nonroutable address listening for metrics requests.
-	host string
-	// Port is the port that the metrics proxy server listens on.
-	Port int
-	// Labels are labels used to apply to metrics.
-	Labels map[string]string
-}
-
-// NewProxy creates a new Proxy with initialized HTTP client and port.
-// dialer is used as the DialContext underlying the metrics HTTP client's RoundTripper.
-//
-// Reference: https://pkg.go.dev/net/http#Transport
-func NewProxy(host string, port int, labels map[string]string, dialer func(context.Context, string, string) (net.Conn, error)) (*Proxy, error) {
-	return &Proxy{
-		client: &http.Client{
-			Transport: &http.Transport{
-				DialContext: dialer,
-			},
-		},
-		server: nil,
-		host:   host,
-		Port:   port,
-		Labels: labels,
-	}, nil
-}
-
-// Serve starts the metrics proxy server for a single in-VM snapshotter.
-func (mp *Proxy) Serve(ctx context.Context) error {
-	mux := http.NewServeMux()
-	mux.HandleFunc("/metrics", mp.metrics)
-
-	mp.server = &http.Server{
-		Addr:    mp.host + ":" + strconv.Itoa(mp.Port),
-		Handler: mux,
-	}
-
-	err := mp.server.ListenAndServe()
-	if err != http.ErrServerClosed {
-		return err
-	}
-
-	return nil
-}
-
-// Shutdown shuts down the remote snapshotter metrics proxy server.
-func (mp *Proxy) Shutdown(ctx context.Context) error {
-	return mp.server.Shutdown(ctx)
-}
-
-// metrics is an HTTP handler that returns metrics for a given VM/snapshotter.
-func (mp *Proxy) metrics(w http.ResponseWriter, req *http.Request) {
-	ctx := req.Context()
-
-	// Pull metrics and copy to HTTP response.
-	res, err := mp.client.Get(RequestPath)
-	if err != nil {
-		log.G(ctx).Errorf("error reading response body: %v\n", err)
-		w.WriteHeader(500)
-		return
-	}
-
-	defer res.Body.Close()
-	response := io.LimitReader(res.Body, MaxMetricsResponseSize)
-
-	io.Copy(w, response)
-}
diff --git a/snapshotter/demux/proxy/address/resolver.go b/snapshotter/demux/proxy/address/resolver.go
index e302594..b9bc780 100644
--- a/snapshotter/demux/proxy/address/resolver.go
+++ b/snapshotter/demux/proxy/address/resolver.go
@@ -21,16 +21,10 @@ type Response struct {
 	Network string `json:"network"`
 
 	// Network address used in net.Dial.
+	// Assumes the host port forms documented in net.SplitHostPort.
+	//
+	// Reference: https://pkg.go.dev/net#SplitHostPort
 	Address string `json:"address"`
-
-	// SnapshotterPort is the port used in vsock.DialContext for sending snapshotter API requests to the remote snapshotter.
-	SnapshotterPort string `json:"snapshotter_port"`
-
-	// MetricsPort is the port used in vsock.DialContext for sending metrics requests to the remote snapshotter.
-	MetricsPort string `json:"metrics_port"`
-
-	// Labels is a map used for applying labels to metrics.
-	Labels map[string]string `json:"labels"`
 }
 
 // Resolver for the proxy network address.
diff --git a/snapshotter/demux/proxy/snapshotter.go b/snapshotter/demux/proxy/snapshotter.go
index ed1cd84..3831688 100644
--- a/snapshotter/demux/proxy/snapshotter.go
+++ b/snapshotter/demux/proxy/snapshotter.go
@@ -20,8 +20,6 @@ import (
 	snapshotsapi "github.com/containerd/containerd/api/services/snapshots/v1"
 	"github.com/containerd/containerd/snapshots"
 	"github.com/containerd/containerd/snapshots/proxy"
-	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/metrics"
-	"github.com/hashicorp/go-multierror"
 	"github.com/sirupsen/logrus"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/credentials/insecure"
@@ -30,31 +28,8 @@ import (
 // SnapshotterDialer defines an interface for establishing a network connection.
 type SnapshotterDialer = func(context.Context, *logrus.Entry, string, uint32)
 
-// RemoteSnapshotter embeds a snapshots.Snapshotter and its metrics proxy.
-type RemoteSnapshotter struct {
-	snapshots.Snapshotter
-	metricsProxy *metrics.Proxy
-}
-
-// Close closes the remote snapshotter's snapshotter and shuts down its metrics proxy server.
-func (rs *RemoteSnapshotter) Close() error {
-	var compiledErr error
-	if err := rs.Snapshotter.Close(); err != nil {
-		compiledErr = multierror.Append(compiledErr, err)
-	}
-	if rs.metricsProxy != nil {
-		if err := rs.metricsProxy.Shutdown(context.Background()); err != nil {
-			compiledErr = multierror.Append(compiledErr, err)
-		}
-	}
-
-	return compiledErr
-}
-
 // NewProxySnapshotter creates a proxy snapshotter using gRPC over vsock connection.
-func NewProxySnapshotter(ctx context.Context, address string,
-	dialer func(context.Context, string) (net.Conn, error), metricsProxy *metrics.Proxy) (*RemoteSnapshotter, error) {
-
+func NewProxySnapshotter(ctx context.Context, address string, dialer func(context.Context, string) (net.Conn, error)) (snapshots.Snapshotter, error) {
 	opts := []grpc.DialOption{
 		grpc.WithContextDialer(dialer),
 		grpc.WithTransportCredentials(insecure.NewCredentials()),
@@ -64,24 +39,5 @@ func NewProxySnapshotter(ctx context.Context, address string,
 	if err != nil {
 		return nil, err
 	}
-
-	// TODO (ginglis13)
-	// we should be monitoring this goroutine's status.
-	// https://github.com/firecracker-microvm/firecracker-containerd/issues/607
-	if metricsProxy != nil {
-		go metricsProxy.Serve(ctx)
-	}
-
-	return &RemoteSnapshotter{proxy.NewSnapshotter(snapshotsapi.NewSnapshotsClient(gRPCConn), address), metricsProxy}, nil
-}
-
-// MetricsProxyPort returns the metrics proxy port for a remote snapshotter.
-func (rs *RemoteSnapshotter) MetricsProxyPort() int {
-	return rs.metricsProxy.Port
-
-}
-
-// MetricsProxyLabels returns the metrics labels for a remote snapshotter.
-func (rs *RemoteSnapshotter) MetricsProxyLabels() map[string]string {
-	return rs.metricsProxy.Labels
+	return proxy.NewSnapshotter(snapshotsapi.NewSnapshotsClient(gRPCConn), address), nil
 }
diff --git a/snapshotter/internal/http_address_resolver.go b/snapshotter/internal/http_address_resolver.go
index cd2c44c..c9aa6e6 100644
--- a/snapshotter/internal/http_address_resolver.go
+++ b/snapshotter/internal/http_address_resolver.go
@@ -21,10 +21,8 @@ import (
 	"net/http"
 	"os"
 	"os/signal"
-	"strconv"
 	"syscall"
 
-	"github.com/containerd/containerd/namespaces"
 	"github.com/sirupsen/logrus"
 	"golang.org/x/sync/errgroup"
 
@@ -35,7 +33,6 @@ import (
 
 var (
 	port               int
-	remotePort         int
 	containerdSockPath string
 	logger             *logrus.Logger
 )
@@ -43,7 +40,6 @@ var (
 func init() {
 	flag.IntVar(&port, "port", 10001, "service port for address resolver")
 	flag.StringVar(&containerdSockPath, "containerdSocket", "/run/firecracker-containerd/containerd.sock", "filepath to the containerd socket")
-	flag.IntVar(&remotePort, "remotePort", 10000, "the remote port on which the remote snapshotter is listening")
 	logger = logrus.New()
 }
 
@@ -75,7 +71,7 @@ func main() {
 
 	http.HandleFunc("/address", queryAddress)
 	httpServer := &http.Server{
-		Addr: fmt.Sprintf("127.0.0.1:%d", port),
+		Addr: fmt.Sprintf(":%d", port),
 	}
 
 	logger.Info(fmt.Sprintf("http resolver serving at port %d", port))
@@ -121,8 +117,7 @@ func queryAddress(writ http.ResponseWriter, req *http.Request) {
 	}
 	defer fcClient.Close()
 
-	ctx := namespaces.WithNamespace(req.Context(), namespace)
-	vmInfo, err := fcClient.GetVMInfo(ctx, &proto.GetVMInfoRequest{VMID: namespace})
+	vmInfo, err := fcClient.GetVMInfo(req.Context(), &proto.GetVMInfoRequest{VMID: namespace})
 	if err != nil {
 		logger.WithField("VMID", namespace).WithError(err).Error("unable to retrieve VM Info")
 		http.Error(writ, "Internal server error", http.StatusInternalServerError)
@@ -132,9 +127,8 @@ func queryAddress(writ http.ResponseWriter, req *http.Request) {
 	writ.WriteHeader(http.StatusOK)
 
 	response, err := json.Marshal(proxyaddress.Response{
-		Network:         "unix",
-		Address:         vmInfo.VSockPath,
-		SnapshotterPort: strconv.Itoa(remotePort),
+		Network: "unix",
+		Address: vmInfo.VSockPath,
 	})
 	if err != nil {
 		http.Error(writ, "Internal server error", http.StatusInternalServerError)


Test patch:
diff --git a/snapshotter/config/config_test.go b/snapshotter/config/config_test.go
index 911a4a5..bd54727 100644
--- a/snapshotter/config/config_test.go
+++ b/snapshotter/config/config_test.go
@@ -62,9 +62,6 @@ func defaultConfig() error {
 				Network: "unix",
 				Address: "/var/lib/demux-snapshotter/snapshotter.sock",
 			},
-			Metrics: metrics{
-				Enable: false,
-			},
 		},
 		Debug: debug{
 			LogLevel: "info",
@@ -82,11 +79,7 @@ func parseExampleConfig() error {
 	  [snapshotter.proxy.address.resolver]
 	    type = "http"
 	    address = "localhost:10001"
-	  [snapshotter.metrics]
-        enable = true
-		port_range = "9000-9999"
-		host = "0.0.0.0"
-		service_discovery_port = 8080
+
 	[debug]
 	  logLevel = "debug"
 	`)
@@ -104,12 +97,6 @@ func parseExampleConfig() error {
 					},
 				},
 			},
-			Metrics: metrics{
-				Enable:               true,
-				PortRange:            "9000-9999",
-				Host:                 "0.0.0.0",
-				ServiceDiscoveryPort: 8080,
-			},
 		},
 		Debug: debug{
 			LogLevel: "debug",
@@ -129,7 +116,7 @@ func parseConfig(input []byte, expected Config) error {
 		return errors.New("expected no error on parse")
 	}
 	if actual != expected {
-		return fmt.Errorf("expected %v actual %v", expected, actual)
+		return fmt.Errorf("expected %s actual %s", expected, actual)
 	}
 	return nil
 }
diff --git a/snapshotter/demux/cache/snapshotter_cache_test.go b/snapshotter/demux/cache/snapshotter_cache_test.go
index 46405eb..d683c0c 100644
--- a/snapshotter/demux/cache/snapshotter_cache_test.go
+++ b/snapshotter/demux/cache/snapshotter_cache_test.go
@@ -17,23 +17,23 @@ import (
 	"context"
 	"testing"
 
+	"github.com/containerd/containerd/snapshots"
 	"github.com/hashicorp/go-multierror"
 	"github.com/pkg/errors"
 
 	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/internal"
-	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/proxy"
 )
 
-func getSnapshotterOkFunction(ctx context.Context, key string) (*proxy.RemoteSnapshotter, error) {
-	return &proxy.RemoteSnapshotter{Snapshotter: &internal.SuccessfulSnapshotter{}}, nil
+func getSnapshotterOkFunction(ctx context.Context, key string) (snapshots.Snapshotter, error) {
+	return &internal.SuccessfulSnapshotter{}, nil
 }
 
-func getSnapshotterErrorFunction(ctx context.Context, key string) (*proxy.RemoteSnapshotter, error) {
-	return &proxy.RemoteSnapshotter{Snapshotter: &internal.SuccessfulSnapshotter{}}, errors.New("MOCK ERROR")
+func getSnapshotterErrorFunction(ctx context.Context, key string) (snapshots.Snapshotter, error) {
+	return &internal.SuccessfulSnapshotter{}, errors.New("MOCK ERROR")
 }
 
-func getFailingSnapshotterOkFunction(ctx context.Context, key string) (*proxy.RemoteSnapshotter, error) {
-	return &proxy.RemoteSnapshotter{Snapshotter: &internal.FailingSnapshotter{}}, nil
+func getFailingSnapshotterOkFunction(ctx context.Context, key string) (snapshots.Snapshotter, error) {
+	return &internal.FailingSnapshotter{}, nil
 }
 
 func getSnapshotterFromEmptyCache(uut *SnapshotterCache) error {
diff --git a/snapshotter/demux/proxy/address/http_resolver_test.go b/snapshotter/demux/proxy/address/http_resolver_test.go
index f2bf9de..4e7b64b 100644
--- a/snapshotter/demux/proxy/address/http_resolver_test.go
+++ b/snapshotter/demux/proxy/address/http_resolver_test.go
@@ -58,23 +58,12 @@ func returnErrorOnJSONParserError() error {
 }
 
 func happyPath() error {
-	reader := mockReader{response: []byte(
-		`{
-			"network": "unix", 
-			"address": "/path/to/snapshotter.vsock", 
-			"snapshotter_port": "10000", 
-			"metrics_port": "10001",
-			"labels": {
-				"test1": "label1",
-				"test2": "label2"
-				}
-			}`), err: io.EOF}
+	reader := mockReader{response: []byte(`{"network": "unix", "address": "/path/to/snapshotter.vsock"}`), err: io.EOF}
 	client := mockClient{getError: nil, getResponse: http.Response{Body: &reader}}
 	uut := HTTPResolver{url: "localhost:10001", client: &client}
 
 	actual, err := uut.Get("namespace")
 	if err != nil {
-		fmt.Println(err)
 		return errors.New("expected no error from HTTP resolver")
 	}
 
@@ -84,18 +73,6 @@ func happyPath() error {
 	if actual.Address != "/path/to/snapshotter.vsock" {
 		return fmt.Errorf("Expected address '/path/to/snapshotter.vsock' but actual %s", actual.Address)
 	}
-	if actual.SnapshotterPort != "10000" {
-		return fmt.Errorf("Expected metrics port '10000' but actual %s", actual.MetricsPort)
-	}
-	if actual.MetricsPort != "10001" {
-		return fmt.Errorf("Expected metrics port '10001' but actual %s", actual.MetricsPort)
-	}
-	if actual.Labels["test1"] != "label1" {
-		return fmt.Errorf("Expected metrics label key='test1' value='label1' but actual %s", actual.Labels["test1"])
-	}
-	if actual.Labels["test2"] != "label2" {
-		return fmt.Errorf("Expected metrics label key='test2' value='label2' but actual %s", actual.Labels["test1"])
-	}
 	return nil
 }
 
diff --git a/snapshotter/demux/snapshotter_test.go b/snapshotter/demux/snapshotter_test.go
index 70d20bd..b3894a4 100644
--- a/snapshotter/demux/snapshotter_test.go
+++ b/snapshotter/demux/snapshotter_test.go
@@ -24,15 +24,14 @@ import (
 
 	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/cache"
 	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/internal"
-	"github.com/firecracker-microvm/firecracker-containerd/snapshotter/demux/proxy"
 )
 
-func fetchOkSnapshotter(ctx context.Context, key string) (*proxy.RemoteSnapshotter, error) {
+func fetchOkSnapshotter(ctx context.Context, key string) (snapshots.Snapshotter, error) {
 	var snapshotter internal.SuccessfulSnapshotter = internal.SuccessfulSnapshotter{}
-	return &proxy.RemoteSnapshotter{Snapshotter: &snapshotter}, nil
+	return &snapshotter, nil
 }
 
-func fetchSnapshotterNotFound(ctx context.Context, key string) (*proxy.RemoteSnapshotter, error) {
+func fetchSnapshotterNotFound(ctx context.Context, key string) (snapshots.Snapshotter, error) {
 	return nil, errors.New("mock snapshotter not found")
 }
 
@@ -42,9 +41,9 @@ func createSnapshotterCacheWithSuccessfulSnapshotter(namespace string) cache.Cac
 	return cache
 }
 
-func fetchFailingSnapshotter(ctx context.Context, key string) (*proxy.RemoteSnapshotter, error) {
+func fetchFailingSnapshotter(ctx context.Context, key string) (snapshots.Snapshotter, error) {
 	var snapshotter internal.FailingSnapshotter = internal.FailingSnapshotter{}
-	return &proxy.RemoteSnapshotter{Snapshotter: &snapshotter}, nil
+	return &snapshotter, nil
 }
 
 func createSnapshotterCacheWithFailingSnapshotter(namespace string) cache.Cache {