|
|
@@ -0,0 +1,81 @@
|
|
|
+package executor
|
|
|
+
|
|
|
+import (
|
|
|
+ "github.com/prometheus/client_golang/prometheus"
|
|
|
+ "github.com/prometheus/client_golang/prometheus/promauto"
|
|
|
+)
|
|
|
+
|
|
|
+const (
|
|
|
+ executionResultSuccess = "success"
|
|
|
+ executionResultFailed = "failed"
|
|
|
+ executionResultBlocked = "blocked"
|
|
|
+ executionResultTimeout = "timeout"
|
|
|
+ executionResultError = "error"
|
|
|
+)
|
|
|
+
|
|
|
+var (
|
|
|
+ metricActionsRequested = promauto.NewCounter(prometheus.CounterOpts{
|
|
|
+ Name: "olivetin_actions_requested_count",
|
|
|
+ Help: "The actions requested count",
|
|
|
+ })
|
|
|
+
|
|
|
+ metricActionExecutionsTotal = promauto.NewCounterVec(prometheus.CounterOpts{
|
|
|
+ Name: "olivetin_action_executions_total",
|
|
|
+ Help: "Total number of finished action executions grouped by result.",
|
|
|
+ }, []string{"result"})
|
|
|
+
|
|
|
+ metricActionExecutionDuration = promauto.NewHistogram(prometheus.HistogramOpts{
|
|
|
+ Name: "olivetin_action_execution_duration_seconds",
|
|
|
+ Help: "Action execution duration in seconds from start to finish.",
|
|
|
+ Buckets: []float64{0.1, 0.5, 1, 2, 5, 10, 30, 60, 120, 300, 600},
|
|
|
+ })
|
|
|
+)
|
|
|
+
|
|
|
+func executionResultLabel(entry *InternalLogEntry) string {
|
|
|
+ if entry.Blocked {
|
|
|
+ return executionResultBlocked
|
|
|
+ }
|
|
|
+
|
|
|
+ return finishedExecutionResultLabel(entry)
|
|
|
+}
|
|
|
+
|
|
|
+func finishedExecutionResultLabel(entry *InternalLogEntry) string {
|
|
|
+ if entry.TimedOut {
|
|
|
+ return executionResultTimeout
|
|
|
+ }
|
|
|
+
|
|
|
+ switch {
|
|
|
+ case entry.ExitCode == 0:
|
|
|
+ return executionResultSuccess
|
|
|
+ case isPreExecutionError(entry):
|
|
|
+ return executionResultError
|
|
|
+ default:
|
|
|
+ return executionResultFailed
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func isPreExecutionError(entry *InternalLogEntry) bool {
|
|
|
+ return entry.ExitCode == DefaultExitCodeNotExecuted || !entry.ExecutionStarted
|
|
|
+}
|
|
|
+
|
|
|
+func recordExecutionMetrics(entry *InternalLogEntry) {
|
|
|
+ if entry == nil || entry.Queued {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ metricActionExecutionsTotal.WithLabelValues(executionResultLabel(entry)).Inc()
|
|
|
+ recordExecutionDuration(entry)
|
|
|
+}
|
|
|
+
|
|
|
+func recordExecutionDuration(entry *InternalLogEntry) {
|
|
|
+ if entry.DatetimeFinished.IsZero() || entry.DatetimeStarted.IsZero() {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ duration := entry.DatetimeFinished.Sub(entry.DatetimeStarted).Seconds()
|
|
|
+ if duration < 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ metricActionExecutionDuration.Observe(duration)
|
|
|
+}
|