forked from tus/tusd
-
Notifications
You must be signed in to change notification settings - Fork 0
/
prometheuscollector.go
110 lines (97 loc) · 2.87 KB
/
prometheuscollector.go
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// package prometheuscollector allows to expose metrics for Prometheus.
//
// Using the provided collector, you can easily expose metrics for tusd in the
// Prometheus exposition format (https://prometheus.io/docs/instrumenting/exposition_formats/):
//
// handler, err := handler.NewHandler(…)
// collector := prometheuscollector.New(handler.Metrics)
// prometheus.MustRegister(collector)
package prometheuscollector
import (
"strconv"
"sync/atomic"
"github.com/iuriikomarov/tusd/pkg/handler"
"github.com/prometheus/client_golang/prometheus"
)
var (
requestsTotalDesc = prometheus.NewDesc(
"tusd_requests_total",
"Total number of requests served by tusd per method.",
[]string{"method"}, nil)
errorsTotalDesc = prometheus.NewDesc(
"tusd_errors_total",
"Total number of errors per status.",
[]string{"status", "message"}, nil)
bytesReceivedDesc = prometheus.NewDesc(
"tusd_bytes_received",
"Number of bytes received for uploads.",
nil, nil)
uploadsCreatedDesc = prometheus.NewDesc(
"tusd_uploads_created",
"Number of created uploads.",
nil, nil)
uploadsFinishedDesc = prometheus.NewDesc(
"tusd_uploads_finished",
"Number of finished uploads.",
nil, nil)
uploadsTerminatedDesc = prometheus.NewDesc(
"tusd_uploads_terminated",
"Number of terminated uploads.",
nil, nil)
)
type Collector struct {
metrics handler.Metrics
}
// New creates a new collector which read froms the provided Metrics struct.
func New(metrics handler.Metrics) Collector {
return Collector{
metrics: metrics,
}
}
func (_ Collector) Describe(descs chan<- *prometheus.Desc) {
descs <- requestsTotalDesc
descs <- errorsTotalDesc
descs <- bytesReceivedDesc
descs <- uploadsCreatedDesc
descs <- uploadsFinishedDesc
descs <- uploadsTerminatedDesc
}
func (c Collector) Collect(metrics chan<- prometheus.Metric) {
for method, valuePtr := range c.metrics.RequestsTotal {
metrics <- prometheus.MustNewConstMetric(
requestsTotalDesc,
prometheus.CounterValue,
float64(atomic.LoadUint64(valuePtr)),
method,
)
}
for httpError, valuePtr := range c.metrics.ErrorsTotal.Load() {
metrics <- prometheus.MustNewConstMetric(
errorsTotalDesc,
prometheus.CounterValue,
float64(atomic.LoadUint64(valuePtr)),
strconv.Itoa(httpError.StatusCode()),
httpError.Error(),
)
}
metrics <- prometheus.MustNewConstMetric(
bytesReceivedDesc,
prometheus.CounterValue,
float64(atomic.LoadUint64(c.metrics.BytesReceived)),
)
metrics <- prometheus.MustNewConstMetric(
uploadsFinishedDesc,
prometheus.CounterValue,
float64(atomic.LoadUint64(c.metrics.UploadsFinished)),
)
metrics <- prometheus.MustNewConstMetric(
uploadsCreatedDesc,
prometheus.CounterValue,
float64(atomic.LoadUint64(c.metrics.UploadsCreated)),
)
metrics <- prometheus.MustNewConstMetric(
uploadsTerminatedDesc,
prometheus.CounterValue,
float64(atomic.LoadUint64(c.metrics.UploadsTerminated)),
)
}