Welcome to mirror list, hosted at ThFree Co, Russian Federation.

blackbox.go « blackbox « internal - gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b0af1b3013dd58ad5814c2ddd86fb87ef204c11b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package blackbox

import (
	"context"
	"net"
	"time"

	"github.com/prometheus/client_golang/prometheus"
	log "github.com/sirupsen/logrus"
	"gitlab.com/gitlab-org/gitaly/v14/internal/git/stats"
	"gitlab.com/gitlab-org/gitaly/v14/internal/version"
	"gitlab.com/gitlab-org/labkit/monitoring"
)

func Run(cfg *Config) error {
	listener, err := net.Listen("tcp", cfg.PrometheusListenAddr)
	if err != nil {
		return err
	}

	go runProbes(cfg)

	return servePrometheus(listener)
}

func runProbes(cfg *Config) {
	for ; ; time.Sleep(cfg.SleepDuration) {
		for _, probe := range cfg.Probes {
			doProbe(probe)
		}
	}
}

func servePrometheus(l net.Listener) error {
	return monitoring.Start(
		monitoring.WithListener(l),
		monitoring.WithBuildInformation(version.GetVersion(), version.GetBuildTime()),
	)
}

func doProbe(probe Probe) {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	entry := log.WithField("probe", probe.Name)
	entry.Info("starting probe")

	clone := &stats.Clone{
		URL:      probe.URL,
		User:     probe.User,
		Password: probe.Password,
	}

	if err := clone.Perform(ctx); err != nil {
		entry.WithError(err).Error("probe failed")
		return
	}

	entry.Info("finished probe")

	setGauge := func(gv *prometheus.GaugeVec, value float64) {
		gv.WithLabelValues(probe.Name).Set(value)
	}

	setGauge(getFirstPacket, clone.Get.FirstGitPacket().Seconds())
	setGauge(getTotalTime, clone.Get.ResponseBody().Seconds())
	setGauge(getAdvertisedRefs, float64(len(clone.Get.Refs)))
	setGauge(wantedRefs, float64(clone.RefsWanted()))
	setGauge(postTotalTime, clone.Post.ResponseBody().Seconds())
	setGauge(postFirstProgressPacket, clone.Post.BandFirstPacket("progress").Seconds())
	setGauge(postFirstPackPacket, clone.Post.BandFirstPacket("pack").Seconds())
	setGauge(postPackBytes, float64(clone.Post.BandPayloadSize("pack")))
}