...
1
16
17 package volume
18
19 import (
20 "fmt"
21 "io"
22 "os"
23 "runtime"
24 "time"
25
26 "k8s.io/apimachinery/pkg/api/resource"
27 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28 servermetrics "k8s.io/kubernetes/pkg/kubelet/server/metrics"
29 )
30
31 var _ MetricsProvider = &metricsBlock{}
32
33
34
35 type metricsBlock struct {
36
37 device string
38 }
39
40
41
42 func NewMetricsBlock(device string) MetricsProvider {
43 return &metricsBlock{device}
44 }
45
46
47
48
49
50
51
52
53 func (mb *metricsBlock) GetMetrics() (*Metrics, error) {
54 startTime := time.Now()
55 defer servermetrics.CollectVolumeStatCalDuration("block", startTime)
56
57
58 if runtime.GOOS == "windows" {
59 return nil, NewNotImplementedError("Windows does not support Block volumes")
60 }
61
62 metrics := &Metrics{Time: metav1.Now()}
63 if mb.device == "" {
64 return metrics, NewNoPathDefinedError()
65 }
66
67 err := mb.getBlockInfo(metrics)
68 if err != nil {
69 return metrics, err
70 }
71
72 return metrics, nil
73 }
74
75
76
77 func (mb *metricsBlock) getBlockInfo(metrics *Metrics) error {
78 dev, err := os.Open(mb.device)
79 if err != nil {
80 return fmt.Errorf("unable to open device %q: %w", mb.device, err)
81 }
82 defer dev.Close()
83
84 end, err := dev.Seek(0, io.SeekEnd)
85 if err != nil {
86 return fmt.Errorf("failed to detect size of %q: %w", mb.device, err)
87 }
88
89 metrics.Capacity = resource.NewQuantity(end, resource.BinarySI)
90
91 return nil
92 }
93
View as plain text