 buildKey = (key)-> "#{name}.#{hostname}.#{key}"
 buildGlobalKey = (key)-> "#{name}.global.#{key}"
 
-counters = {}
-gauges = {}
-summaries = {}
+promMetrics = {}
 
 destructors = []
 

	inc : (key, sampleRate = 1)->
		statsd.increment buildKey(key), sampleRate
		key = this.sanitizeKey(key)
		if !counters[key]?
			counters[key] = new prom.Counter({
		  		name: "#{name}_#{key}",
				help: key, 
				labelNames: ['name','host']
			})
		counters[key].inc({name: name, host: hostname})

	count : (key, count, sampleRate = 1)->
		statsd.count buildKey(key), count, sampleRate

		done:->
			timeSpan = new Date - this.start
			statsd.timing(buildKey(this.key), timeSpan, this.sampleRate)
			if !promMetrics[this.key]
				promMetrics[this.key] = new prom.Summary({
					name: "#{name}_timer_#{this.key}".replace(/\./g,"_"),
					help: this.key,
					maxAgeSeconds: 600,
					ageBuckets: 10
				})
			promMetrics[this.key].observe(timeSpan)
			return timeSpan

	gauge : (key, value, sampleRate = 1)->
		statsd.gauge buildKey(key), value, sampleRate
		key = this.sanitizeKey(key)
		if !promMetrics[key]
			promMetrics[key] = new prom.Gauge({
				name: "#{name}_#{key}",
				help: key, 
				labelNames: ['name','host']
			})
		promMetrics[key].set({name: name, host: hostname}, this.sanitizeValue(value))

	globalGauge: (key, value, sampleRate = 1)->
		statsd.gauge buildGlobalKey(key), value, sampleRate
		key = this.sanitizeKey(key)
		if !promMetrics[key]
			promMetrics[key] = new prom.Gauge({
				name: "#{name}_#{key}",
				help: key, 
				labelNames: ['name','host']
			})
		promMetrics[key].set({name: name},this.sanitizeValue(value))

	mongodb: require "./mongodb"
	http: require "./http"
