Set CORS Headers on API requests

By setting Access-Control headers, the Prometheus metrics API can be
accessed by cross-origin javascript applications (e.g., an external
dashboard pulling Prometheus metrics).
This commit is contained in:
Bernerd Schaefer 2013-04-11 14:51:42 +02:00
parent 2310f549dd
commit 5e9447996b

View file

@ -26,6 +26,13 @@ import (
"time" "time"
) )
func (serv MetricsService) setAccessControlHeaders(rb *gorest.ResponseBuilder) {
rb.AddHeader("Access-Control-Allow-Headers", "Accept, Authorization, Content-Type, Origin")
rb.AddHeader("Access-Control-Allow-Methods", "GET")
rb.AddHeader("Access-Control-Allow-Origin", "*")
rb.AddHeader("Access-Control-Expose-Headers", "Date")
}
func (serv MetricsService) Query(expr string, formatJson string) (result string) { func (serv MetricsService) Query(expr string, formatJson string) (result string) {
exprNode, err := rules.LoadExprFromString(expr) exprNode, err := rules.LoadExprFromString(expr)
if err != nil { if err != nil {
@ -35,6 +42,7 @@ func (serv MetricsService) Query(expr string, formatJson string) (result string)
timestamp := serv.time.Now() timestamp := serv.time.Now()
rb := serv.ResponseBuilder() rb := serv.ResponseBuilder()
serv.setAccessControlHeaders(rb)
var format ast.OutputFormat var format ast.OutputFormat
if formatJson != "" { if formatJson != "" {
format = ast.JSON format = ast.JSON
@ -56,6 +64,7 @@ func (serv MetricsService) QueryRange(expr string, end int64, duration int64, st
return ast.ErrorToJSON(errors.New("Expression does not evaluate to vector type")) return ast.ErrorToJSON(errors.New("Expression does not evaluate to vector type"))
} }
rb := serv.ResponseBuilder() rb := serv.ResponseBuilder()
serv.setAccessControlHeaders(rb)
rb.SetContentType(gorest.Application_Json) rb.SetContentType(gorest.Application_Json)
if end == 0 { if end == 0 {
@ -89,6 +98,7 @@ func (serv MetricsService) QueryRange(expr string, end int64, duration int64, st
func (serv MetricsService) Metrics() string { func (serv MetricsService) Metrics() string {
metricNames, err := serv.appState.Storage.GetAllValuesForLabel(model.MetricNameLabel) metricNames, err := serv.appState.Storage.GetAllValuesForLabel(model.MetricNameLabel)
rb := serv.ResponseBuilder() rb := serv.ResponseBuilder()
serv.setAccessControlHeaders(rb)
rb.SetContentType(gorest.Application_Json) rb.SetContentType(gorest.Application_Json)
if err != nil { if err != nil {
log.Printf("Error loading metric names: %v", err) log.Printf("Error loading metric names: %v", err)