 
 	sweep: () ->
 		thresh = new Date(Date.now() - 1000 * 60 * PromWrapper.ttlInMinutes)
-		for key in Object.keys(@instances)
-			if thresh > @instances[key].time
+		@instances.forEach (instance, key) =>
+			if thresh > instance.time
 				if process.env['DEBUG_METRICS']
-					console.log("Sweeping stale metric instance", @name, opts: @instances[key].opts, key)
-				@metric.remove(optsAsArgs(@instances[key].opts, @metric.labelNames)...)
+					console.log("Sweeping stale metric instance", @name, opts: instance.opts, key)
+				@metric.remove(optsAsArgs(instance.opts, @metric.labelNames)...)
 
 		if thresh > @lastAccess
 			if process.env['DEBUG_METRICS']
-				console.log("Sweeping stale metric", @name)
-			delete metrics[@name]
+				console.log("Sweeping stale metric", @name, thresh, @lastAccess)
+			metrics.delete(@name)
 			registry.removeSingleMetric(@name)
 
 	_execMethod: (method, opts, value) ->
 		opts = extendOpts(opts, @metric.labelNames)
 		key = optsKey(opts)
-		@instances[key] = { time: new Date(), opts } unless key == ''
+		@instances.set(key, { time: new Date(), opts }) unless key == ''
 		@lastAccess = new Date()
 		@metric[method](opts, value)
 

	registry: registry

	metric: (type, name) ->
		registry.getSingleMetric(name) || new MetricWrapper(type, name)

	collectDefaultMetrics: prom.collectDefaultMetrics


class MetricWrapper
	constructor: (type, name) ->
		metrics[name] = this
		@name = name
		@instances = {}
		@lastAccess = new Date()
		@metric = switch type
			when "counter"

			if PromWrapper.ttlInMinutes
				if process.env['DEBUG_METRICS']
					console.log("Sweeping metrics")
				metrics.forEach (metric, key) =>
					metric.sweep()
	60000)


