@@ -17,11 +17,16 @@ limitations under the License.
17
17
package main
18
18
19
19
import (
20
+ "context"
20
21
"flag"
21
22
"fmt"
23
+ "net"
24
+ "net/http"
22
25
"os"
26
+ "strings"
23
27
24
28
"github.com/csi-driver/blobfuse-csi-driver/pkg/blobfuse"
29
+ "github.com/prometheus/client_golang/prometheus/promhttp"
25
30
"k8s.io/klog"
26
31
)
27
32
@@ -30,9 +35,10 @@ func init() {
30
35
}
31
36
32
37
var (
33
- endpoint = flag .String ("endpoint" , "unix://tmp/csi.sock" , "CSI endpoint" )
34
- nodeID = flag .String ("nodeid" , "" , "node id" )
35
- version = flag .Bool ("version" , false , "Print the version and exit." )
38
+ endpoint = flag .String ("endpoint" , "unix://tmp/csi.sock" , "CSI endpoint" )
39
+ nodeID = flag .String ("nodeid" , "" , "node id" )
40
+ version = flag .Bool ("version" , false , "Print the version and exit." )
41
+ metricsAddress = flag .String ("metrics-address" , "0.0.0.0:10252" , "export the metrics" )
36
42
)
37
43
38
44
func main () {
@@ -51,6 +57,7 @@ func main() {
51
57
os .Exit (1 )
52
58
}
53
59
60
+ exportMetrics ()
54
61
handle ()
55
62
os .Exit (0 )
56
63
}
@@ -62,3 +69,39 @@ func handle() {
62
69
}
63
70
driver .Run (* endpoint )
64
71
}
72
+
73
+ func exportMetrics () {
74
+ l , err := net .Listen ("tcp" , * metricsAddress )
75
+ if err != nil {
76
+ klog .Warningf ("failed to get listener for metrics endpoint: %v" , err )
77
+ return
78
+ }
79
+ serve (context .Background (), l , serveMetrics )
80
+ }
81
+
82
+ func serve (ctx context.Context , l net.Listener , serveFunc func (net.Listener ) error ) {
83
+ path := l .Addr ().String ()
84
+ klog .V (2 ).Infof ("set up prometheus server on %v" , path )
85
+ go func () {
86
+ defer l .Close ()
87
+ if err := serveFunc (l ); err != nil {
88
+ klog .Fatalf ("serve failure(%v), address(%v)" , err , path )
89
+ }
90
+ }()
91
+ }
92
+
93
+ func serveMetrics (l net.Listener ) error {
94
+ m := http .NewServeMux ()
95
+ m .Handle ("/metrics" , promhttp .Handler ())
96
+ return trapClosedConnErr (http .Serve (l , m ))
97
+ }
98
+
99
+ func trapClosedConnErr (err error ) error {
100
+ if err == nil {
101
+ return nil
102
+ }
103
+ if strings .Contains (err .Error (), "use of closed network connection" ) {
104
+ return nil
105
+ }
106
+ return err
107
+ }
0 commit comments