Skip to content

Commit

Permalink
Merge pull request #223 from jmcarp/more-prometheus-metrics
Browse files Browse the repository at this point in the history
Export request latency and worker metrics.
  • Loading branch information
vito committed Nov 28, 2017
2 parents 5e111aa + a43da3e commit b06d7bc
Showing 1 changed file with 94 additions and 0 deletions.
94 changes: 94 additions & 0 deletions metric/emitter/prometheus.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ type PrometheusEmitter struct {
buildsAborted prometheus.Counter
buildsFinishedVec *prometheus.CounterVec
buildDurationsVec *prometheus.HistogramVec

workerContainers *prometheus.GaugeVec
workerVolumes *prometheus.GaugeVec

httpRequestsDuration *prometheus.HistogramVec
}

type PrometheusConfig struct {
Expand Down Expand Up @@ -111,6 +116,38 @@ func (config *PrometheusConfig) NewEmitter() (metric.Emitter, error) {
)
prometheus.MustRegister(buildDurationsVec)

workerContainers := prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Namespace: "concourse",
Subsystem: "workers",
Name: "containers",
Help: "Number of containers per worker",
},
[]string{"worker"},
)
prometheus.MustRegister(workerContainers)
workerVolumes := prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Namespace: "concourse",
Subsystem: "workers",
Name: "volumes",
Help: "Number of volumes per worker",
},
[]string{"worker"},
)
prometheus.MustRegister(workerVolumes)

httpRequestsDuration := prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Namespace: "concourse",
Subsystem: "http_responses",
Name: "duration_seconds",
Help: "Response time in seconds",
},
[]string{"path", "method"},
)
prometheus.MustRegister(httpRequestsDuration)

listener, err := net.Listen("tcp", config.bind())
if err != nil {
return nil, err
Expand All @@ -127,6 +164,11 @@ func (config *PrometheusConfig) NewEmitter() (metric.Emitter, error) {
buildsErrored: buildsErrored,
buildsFailed: buildsFailed,
buildsAborted: buildsAborted,

workerContainers: workerContainers,
workerVolumes: workerVolumes,

httpRequestsDuration: httpRequestsDuration,
}, nil
}

Expand All @@ -140,6 +182,12 @@ func (emitter *PrometheusEmitter) Emit(logger lager.Logger, event metric.Event)
emitter.buildsStarted.Inc()
case "build finished":
emitter.buildFinishedMetrics(logger, event)
case "worker containers":
emitter.workerContainersMetrics(logger, event)
case "worker volumes":
emitter.workerVolumesMetrics(logger, event)
case "http response time":
emitter.httpResponseTimeMetrics(logger, event)
default:
// unless we have a specific metric, we do nothing
}
Expand Down Expand Up @@ -191,3 +239,49 @@ func (emitter *PrometheusEmitter) buildFinishedMetrics(logger lager.Logger, even
duration = duration / 1000
emitter.buildDurationsVec.WithLabelValues(team, pipeline).Observe(duration)
}

func (emitter *PrometheusEmitter) workerContainersMetrics(logger lager.Logger, event metric.Event) {
worker, exists := event.Attributes["worker"]
if !exists {
logger.Error("failed-to-find-worker-in-event", fmt.Errorf("expected worker to exist in event.Attributes"))
}

containers, ok := event.Value.(int)
if !ok {
logger.Error("worker-volumes-event-value-type-mismatch", fmt.Errorf("expected event.Value to be an int"))
}

emitter.workerContainers.WithLabelValues(worker).Set(float64(containers))
}

func (emitter *PrometheusEmitter) workerVolumesMetrics(logger lager.Logger, event metric.Event) {
worker, exists := event.Attributes["worker"]
if !exists {
logger.Error("failed-to-find-worker-in-event", fmt.Errorf("expected worker to exist in event.Attributes"))
}

workers, ok := event.Value.(int)
if !ok {
logger.Error("worker-volumes-event-value-type-mismatch", fmt.Errorf("expected event.Value to be an int"))
}

emitter.workerContainers.WithLabelValues(worker).Set(float64(workers))
}

func (emitter *PrometheusEmitter) httpResponseTimeMetrics(logger lager.Logger, event metric.Event) {
path, exists := event.Attributes["path"]
if !exists {
logger.Error("failed-to-find-path-in-event", fmt.Errorf("expected path to exist in event.Attributes"))
}
method, exists := event.Attributes["method"]
if !exists {
logger.Error("failed-to-find-method-in-event", fmt.Errorf("expected method to exist in event.Attributes"))
}

responseTime, ok := event.Value.(float64)
if !ok {
logger.Error("http-response-time-event-value-type-mismatch", fmt.Errorf("expected event.Value to be a float64"))
}

emitter.httpRequestsDuration.WithLabelValues(path, method).Observe(responseTime / 1000)
}

0 comments on commit b06d7bc

Please sign in to comment.