)

/*
Boilerplate metrics about the metrics reporting subservice.  These are only
exposed if the DefaultRegistry's exporter is hooked into the HTTP request
handler.
*/
var (
	marshalErrorCount = metrics.NewCounter()
	dumpErrorCount    = metrics.NewCounter()

	requestCount          = metrics.NewCounter()
	requestLatencyBuckets = metrics.LogarithmicSizedBucketsFor(0, 1000)
	requestLatency        = metrics.NewHistogram(&metrics.HistogramSpecification{
		Starts:                requestLatencyBuckets,
		BucketBuilder:         metrics.AccumulatingBucketBuilder(metrics.EvictAndReplaceWith(50, maths.Average), 1000),
		ReportablePercentiles: []float64{0.01, 0.05, 0.5, 0.9, 0.99},
	})

	startTime = metrics.NewGauge()
)

func init() {
	startTime.Set(nil, float64(time.Now().Unix()))

	DefaultRegistry.Register("telemetry_requests_metrics_total", "A counter of the total requests made against the telemetry system.", NilLabels, requestCount)
	DefaultRegistry.Register("telemetry_requests_metrics_latency_microseconds", "A histogram of the response latency for requests made against the telemetry system.", NilLabels, requestLatency)

	DefaultRegistry.Register("instance_start_time_seconds", "The time at which the current instance started (UTC).", NilLabels, startTime)
}
	writeMemory                 = "write_memory"
)

var (
	diskLatencyHistogram = &metrics.HistogramSpecification{
		Starts:                metrics.LogarithmicSizedBucketsFor(0, 5000),
		BucketBuilder:         metrics.AccumulatingBucketBuilder(metrics.EvictAndReplaceWith(10, maths.Average), 100),
		ReportablePercentiles: []float64{0.01, 0.05, 0.5, 0.90, 0.99},
	}

	curationDuration          = metrics.NewCounter()
	curationDurations         = metrics.NewHistogram(diskLatencyHistogram)
	storageOperations         = metrics.NewCounter()
	storageOperationDurations = metrics.NewCounter()
	storageLatency            = metrics.NewHistogram(diskLatencyHistogram)
	queueSizes                = metrics.NewGauge()
)

func recordOutcome(duration time.Duration, err error, success, failure map[string]string) {
	labels := success
	if err != nil {
		labels = failure
	}

	storageOperations.Increment(labels)
	asFloat := float64(duration / time.Microsecond)
	storageLatency.Add(labels, asFloat)
	storageOperationDurations.IncrementBy(labels, asFloat)
}

func init() {