Skip to content

Commit cde9d11

Browse files
authored
Merge pull request #481 from kimdre/feat/prometheus
feat: add Prometheus metrics for deployments and webhooks
2 parents 0f50b83 + f189ea6 commit cde9d11

19 files changed

+242
-88
lines changed

Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ COPY --from=build-stage /doco-cd /doco-cd
4646

4747
ENV TZ=UTC \
4848
HTTP_PORT=80 \
49+
METRICS_PORT=9090 \
4950
LOG_LEVEL=info
5051

5152
ENTRYPOINT ["/doco-cd"]

cmd/doco-cd/http_handler.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,19 @@ import (
1111
"strings"
1212
"time"
1313

14-
"github.com/go-git/go-git/v5/plumbing"
15-
16-
"github.com/kimdre/doco-cd/internal/utils"
17-
14+
"github.com/docker/cli/cli/command"
1815
"github.com/docker/compose/v2/pkg/api"
1916
"github.com/docker/docker/api/types/container"
2017
"github.com/docker/docker/client"
21-
22-
"github.com/docker/cli/cli/command"
18+
"github.com/go-git/go-git/v5/plumbing"
2319
"github.com/google/uuid"
2420

2521
"github.com/kimdre/doco-cd/internal/config"
2622
"github.com/kimdre/doco-cd/internal/docker"
2723
"github.com/kimdre/doco-cd/internal/git"
2824
"github.com/kimdre/doco-cd/internal/logger"
25+
"github.com/kimdre/doco-cd/internal/prometheus"
26+
"github.com/kimdre/doco-cd/internal/utils"
2927
"github.com/kimdre/doco-cd/internal/webhook"
3028
)
3129

@@ -39,6 +37,7 @@ type handlerData struct {
3937
}
4038

4139
func onError(w http.ResponseWriter, log *slog.Logger, errMsg string, details any, jobID string, statusCode int) {
40+
prometheus.WebhookErrorsTotal.Inc()
4241
log.Error(errMsg)
4342
JSONError(w,
4443
errMsg,
@@ -371,9 +370,12 @@ func HandleEvent(ctx context.Context, jobLog *slog.Logger, w http.ResponseWriter
371370
}
372371

373372
msg := "job completed successfully"
374-
elapsedTime := time.Since(startTime).Truncate(time.Millisecond).String()
375-
jobLog.Info(msg, slog.String("elapsed_time", elapsedTime))
373+
elapsedTime := time.Since(startTime)
374+
jobLog.Info(msg, slog.String("elapsed_time", elapsedTime.Truncate(time.Millisecond).String()))
376375
JSONResponse(w, msg, jobID, http.StatusCreated)
376+
377+
prometheus.WebhookRequestsTotal.Inc()
378+
prometheus.WebhookDuration.Observe(elapsedTime.Seconds())
377379
}
378380

379381
func (h *handlerData) WebhookHandler(w http.ResponseWriter, r *http.Request) {

cmd/doco-cd/http_handler_test.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,10 @@ import (
1313
"regexp"
1414
"testing"
1515

16-
"github.com/docker/docker/client"
17-
1816
"github.com/docker/compose/v2/pkg/api"
1917
"github.com/docker/compose/v2/pkg/compose"
20-
2118
"github.com/docker/docker/api/types/container"
19+
"github.com/docker/docker/client"
2220

2321
"github.com/kimdre/doco-cd/internal/config"
2422
"github.com/kimdre/doco-cd/internal/docker"

cmd/doco-cd/main.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,15 @@ import (
1313
"sync"
1414
"time"
1515

16-
"github.com/kimdre/doco-cd/internal/utils"
17-
1816
"github.com/docker/docker/api/types/container"
19-
20-
"github.com/go-git/go-git/v5/plumbing/transport"
21-
2217
"github.com/docker/docker/client"
18+
"github.com/go-git/go-git/v5/plumbing/transport"
2319

2420
"github.com/kimdre/doco-cd/internal/config"
2521
"github.com/kimdre/doco-cd/internal/docker"
2622
"github.com/kimdre/doco-cd/internal/logger"
23+
"github.com/kimdre/doco-cd/internal/prometheus"
24+
"github.com/kimdre/doco-cd/internal/utils"
2725
)
2826

2927
const (
@@ -140,6 +138,8 @@ func main() {
140138

141139
log.Info("starting application", slog.String("version", Version), slog.String("log_level", c.LogLevel))
142140

141+
prometheus.AppInfo.WithLabelValues(Version, c.LogLevel, time.Now().Format(time.RFC3339)).Set(1)
142+
143143
// Log if proxy is used
144144
if c.HttpProxy != (transport.ProxyOptions{}) {
145145
log.Info("using HTTP proxy", slog.String("url", GetProxyUrlRedacted(c.HttpProxy.URL)))
@@ -312,6 +312,16 @@ func main() {
312312
}()
313313
}
314314

315+
go func() {
316+
log.Info("serving prometheus metrics", slog.Int("http_port", int(c.MetricsPort)), slog.String("path", prometheus.MetricsPath))
317+
318+
if err = prometheus.Serve(c.MetricsPort); err != nil {
319+
log.Error("failed to start Prometheus metrics server", logger.ErrAttr(err))
320+
} else {
321+
log.Debug("Prometheus metrics server started successfully", slog.Int("port", int(c.MetricsPort)))
322+
}
323+
}()
324+
315325
server := &http.Server{
316326
Addr: fmt.Sprintf(":%d", c.HttpPort),
317327
ReadHeaderTimeout: 3 * time.Second,

cmd/doco-cd/main_test.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,16 @@ import (
1111
"path/filepath"
1212
"testing"
1313

14-
"github.com/kimdre/doco-cd/internal/encryption"
15-
16-
"github.com/kimdre/doco-cd/internal/git"
17-
18-
"github.com/docker/docker/client"
19-
20-
"github.com/docker/docker/api/types/container"
21-
2214
"github.com/docker/compose/v2/pkg/api"
2315
"github.com/docker/compose/v2/pkg/compose"
24-
16+
"github.com/docker/docker/api/types/container"
17+
"github.com/docker/docker/client"
2518
"github.com/google/uuid"
2619

2720
"github.com/kimdre/doco-cd/internal/config"
2821
"github.com/kimdre/doco-cd/internal/docker"
22+
"github.com/kimdre/doco-cd/internal/encryption"
23+
"github.com/kimdre/doco-cd/internal/git"
2924
"github.com/kimdre/doco-cd/internal/logger"
3025
"github.com/kimdre/doco-cd/internal/webhook"
3126
)

cmd/doco-cd/poll_handler.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,19 @@ import (
1010
"sync"
1111
"time"
1212

13-
"github.com/go-git/go-git/v5/plumbing"
14-
1513
"github.com/docker/cli/cli/command"
1614
"github.com/docker/compose/v2/pkg/api"
1715
"github.com/docker/docker/api/types/container"
1816
"github.com/docker/docker/client"
17+
"github.com/go-git/go-git/v5/plumbing"
1918
"github.com/google/uuid"
2019
"golang.org/x/net/context"
2120

2221
"github.com/kimdre/doco-cd/internal/config"
2322
"github.com/kimdre/doco-cd/internal/docker"
2423
"github.com/kimdre/doco-cd/internal/git"
2524
log "github.com/kimdre/doco-cd/internal/logger"
25+
"github.com/kimdre/doco-cd/internal/prometheus"
2626
"github.com/kimdre/doco-cd/internal/utils"
2727
"github.com/kimdre/doco-cd/internal/webhook"
2828
)
@@ -69,7 +69,10 @@ func (h *handlerData) PollHandler(pollJob *config.PollJob) {
6969
if pollJob.LastRun == 0 || time.Now().Unix() >= pollJob.NextRun {
7070
logger.Debug("Running poll for repository")
7171

72-
_ = RunPoll(context.Background(), pollJob.Config, h.appConfig, h.dataMountPoint, h.dockerCli, h.dockerClient, logger)
72+
err := RunPoll(context.Background(), pollJob.Config, h.appConfig, h.dataMountPoint, h.dockerCli, h.dockerClient, logger)
73+
if err != nil {
74+
prometheus.PollErrors.Inc()
75+
}
7376

7477
pollJob.NextRun = time.Now().Unix() + int64(pollJob.Config.Interval)
7578
} else {
@@ -421,8 +424,11 @@ func RunPoll(ctx context.Context, pollConfig config.PollConfig, appConfig *confi
421424
}
422425

423426
nextRun := time.Now().Add(time.Duration(pollConfig.Interval) * time.Second).Format(time.RFC3339)
424-
elapsedTime := time.Since(startTime).Truncate(time.Millisecond).String()
425-
jobLog.Info("job completed successfully", slog.String("elapsed_time", elapsedTime), slog.String("next_run", nextRun))
427+
elapsedTime := time.Since(startTime)
428+
jobLog.Info("job completed successfully", slog.String("elapsed_time", elapsedTime.Truncate(time.Millisecond).String()), slog.String("next_run", nextRun))
429+
430+
prometheus.PollTotal.Inc()
431+
prometheus.PollDuration.Observe(elapsedTime.Seconds())
426432

427433
return nil
428434
}

cmd/doco-cd/poll_handler_test.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,14 @@ import (
44
"context"
55
"testing"
66

7-
"github.com/kimdre/doco-cd/internal/encryption"
8-
97
"github.com/docker/compose/v2/pkg/api"
108
"github.com/docker/compose/v2/pkg/compose"
11-
129
"github.com/docker/docker/api/types/container"
1310
"github.com/docker/docker/client"
1411

1512
"github.com/kimdre/doco-cd/internal/config"
1613
"github.com/kimdre/doco-cd/internal/docker"
14+
"github.com/kimdre/doco-cd/internal/encryption"
1715
"github.com/kimdre/doco-cd/internal/logger"
1816
)
1917

dev.compose.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
x-poll-config: &poll-config
22
POLL_CONFIG: |
3-
- url: https://github.com/kimdre/doco-cd.git
3+
- url: https://github.com/kimdre/doco-cd_tests.git
44
reference: main
55
interval: 15
66
target: "" # "test"
@@ -17,6 +17,7 @@ services:
1717
restart: unless-stopped
1818
ports:
1919
- "80:80"
20+
- "9090:9090"
2021
env_file:
2122
- .env
2223
environment:

docker-compose.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ services:
1515
image: ghcr.io/kimdre/doco-cd:latest
1616
restart: unless-stopped
1717
ports:
18-
- "80:80"
18+
- "80:80" # Webhook endpoint
19+
- "9090:9090" # Prometheus metrics
1920
# For all available environment variables and explanations, see https://github.com/kimdre/doco-cd/wiki/App-Settings
2021
environment:
2122
TZ: Europe/Berlin

docs

Submodule docs updated from 2024c1c to 51fec80

0 commit comments

Comments
 (0)