Projet

Général

Profil

Paste
Télécharger au format
Statistiques
| Branche: | Révision:

root / plugins / zfs / zfs_usage_ @ e3842681

Historique | Voir | Annoter | Télécharger (10,2 ko)

1 fe35abf5 Stig Sandbeck Mathisen
#!/usr/bin/env perl
2 05710b1f Claudius
# -*- perl
3
4
=pod
5
6
=head1 NAME
7
8
zfs_usage_ - Script to monitor zfs pool usage
9
10
=head1 CONFIGURATION
11
12
Create one symlink per zpool for exampe zfs_usage_system
13
14 947313b6 Claudius
if you need to override the defaults below:
15
16
 [zfs_usage_*]
17
  env.zpoolexec - Path to zpool binary
18
  env.zfsexec   - Path to zfs binary
19
20
=head2 DEFAULT CONFIGURATION
21
22
 [zfs_usage_*]
23
  env.zpoolexec /sbin/zpool
24
  env.zfsexec   /sbin/zfs
25
26
27 05710b1f Claudius
=head1 BUGS
28
29
=head1 AUTHOR
30
31 5ebdabf4 Kenyon Ralph
2012, Claudius Herder
32 05710b1f Claudius
33
=head1 MAGIC MARKERS
34
35
 #%# family=auto
36
 #%# capabilities=autoconf suggest
37
38 a129a679 Claudius
=head1 LICENSE
39
40
GPLv2
41
42 05710b1f Claudius
=cut
43
44
use strict;
45
use warnings;
46
use Munin::Plugin;
47
need_multigraph();
48
49
my $filesystems;
50
my $zpool;
51 947313b6 Claudius
my $zpoolexec = (defined($ENV{'zpoolexec'}) ? $ENV{'zpoolexec'} : '/sbin/zpool');
52
my $zfsexec   = (defined($ENV{'zfsexec'}) ? $ENV{'zfsexec'} : '/sbin/zfs');
53 05710b1f Claudius
54
my $properties = {
55
  available           =>  "Read-only property that identifies the amount of disk"
56
                         ." space available to a file system and all its children,"
57
                         ." assuming no other activity in the pool. Because disk"
58
                         ." space is shared within a pool, available space can be"
59
                         ." limited by various factors including physical pool size,"
60
                         ." quotas, reservations, and other datasets within the"
61
                         ." pool.",
62
63
  quota               =>  "Limits the amount of disk space a file system and its"
64
                         ." descendents can consume. This property enforces a"
65
                         ." hard limit on the amount of disk space used, including"
66
                         ." all space consumed by descendents, such as file systems"
67
                         ." and snapshots. Setting a quota on a descendent of a file"
68
                         ." system that already has a quota does not override the"
69
                         ." ancestor's quota, but rather imposes an additional"
70
                         ." limit. Quotas cannot be set on volumes, as the volsize"
71
                         ." property acts as an implicit quota.",
72
73
  referenced          =>  "Read-only property that identifies the amount of data"
74
                         ." accessible by a dataset, which might or might not be"
75
                         ." shared with other datasets in the pool."
76
                         ." When a snapshot or clone is created, it initially"
77
                         ." references the same amount of disk space as the file"
78
                         ." system or snapshot it was created from, because its"
79
                         ." contents are identical.",
80
81
  refquota            =>  "Sets the amount of disk space that a dataset can"
82
                         ." consume. This property enforces a hard limit on the"
83
                         ." amount of space used. This hard limit does not include"
84
                         ." disk space used by descendents, such as snapshots and"
85
                         ." clones.",
86
87
  refreservation      =>  "Sets the minimum amount of disk space that is"
88
                         ." guaranteed to a dataset, not including descendents,"
89
                         ." such as snapshots and clones. When the amount of disk"
90
                         ." space used is below this value, the dataset is treated as if"
91
                         ." it were taking up the amount of space specified by"
92
                         ." refreservation. The refreservation reservation is"
93
                         ." accounted for in the parent dataset's disk space used,"
94
                         ." and counts against the parent dataset's quotas and"
95
                         ." reservations."
96
                         ." If refreservation is set, a snapshot is only allowed if"
97
                         ." enough free pool space is available outside of this"
98
                         ." reservation to accommodate the current number of"
99
                         ." referenced bytes in the dataset.",
100
101
  reservation         => "Sets the minimum amount of disk space guaranteed to"
102
                         ." a file system and its descendents. When the amount of"
103
                         ." disk space used is below this value, the file system is"
104
                         ." treated as if it were using the amount of space specified"
105
                         ." by its reservation. Reservations are accounted for in the"
106
                         ." parent file system's disk space used, and count against"
107
                         ." the parent file system's quotas and reservations.",
108
109
  type                =>  "Read-only property that identifies the dataset type as"
110
                         ." filesystem (file system or clone), volume, or"
111 5ebdabf4 Kenyon Ralph
                             ." snapshot.",
112 05710b1f Claudius
113
  used                =>  "Read-only property that identifies the amount of disk"
114
                         ." space consumed by a dataset and all its descendents.",
115
116
  usedbychildren      =>  "Read-only property that identifies the amount of disk"
117
                         ." space that is used by children of this dataset, which"
118
                         ." would be freed if all the dataset's children were"
119
                         ." destroyed. The property abbreviation is usedchild.",
120
121
  usedbydataset       =>  "Read-only property that identifies the amount of disk"
122
                         ." space that is used by a dataset itself, which would be"
123
                         ." freed if the dataset was destroyed, after first destroying"
124
                         ." any snapshots and removing any refreservation"
125
                         ." reservations. The property abbreviation is usedds.",
126
127
  usedbyrefreservation=>  "Read-only property that identifies the amount of disk"
128
                         ." space that is used by a refreservation set on a dataset,"
129
                         ." which would be freed if the refreservation was"
130
                         ." removed.",
131
132
  usedbysnapshots     =>  "Read-only property that identifies the amount of disk"
133
                         ." space that is consumed by snapshots of a dataset. In"
134
                         ." particular, it is the amount of disk space that would be"
135
                         ." freed if all of this dataset's snapshots were destroyed."
136
                         ." Note that this value is not simply the sum of the"
137
                         ." snapshots' used properties, because space can be"
138
                         ." shared by multiple snapshots.",
139
  volsize             =>  "For volumes, specifies the logical size of the volume.",
140
};
141
142
my @order = (
143
"usedbydataset",
144
"usedbysnapshots",
145
"usedbyrefreservation",
146
"usedbychildren",
147
"available",
148
"quota",
149
"refquota",
150
"referenced",
151
"reservation",
152
"refreservation",
153
"used",
154
"volsize",
155
);
156
157
sub do_collect {
158
    my @params = join(',',( keys %{$properties} ));
159 947313b6 Claudius
    my $fsget="$zfsexec get -H -p -r -t filesystem,volume @params $zpool";
160 05710b1f Claudius
161 947313b6 Claudius
    foreach my $line (split(/\n/, `$fsget` )) {
162
        my ($name, $key, $value, undef ) = (split(/\t/,$line));
163
        ($name =~ s/\//_/g);
164
        $filesystems->{$name}->{$key}=$value;
165 05710b1f Claudius
    }
166
}
167
168
169
sub do_config_fs {
170
    my ($fs) = @_;
171
    my $fs_slash = ($fs);
172
    ($fs_slash =~ s/_/\//g);
173
174
    if ( $fs ne $zpool ) {
175 cde12172 Stig Sandbeck Mathisen
        printf( "multigraph zfs_usage_%s.%s\n",
176
            clean_fieldname($zpool), clean_fieldname($fs) );
177 05710b1f Claudius
        print "graph_title ZFS usage for $filesystems->{$fs}->{type} $fs_slash\n";
178
        print "graph_info This graph shows used bytes of $filesystems->{$fs}->{type} $fs_slash\n";
179
    } else {
180 cde12172 Stig Sandbeck Mathisen
        printf( "multigraph zfs_usage_%s\n", clean_fieldname($zpool) );
181 05710b1f Claudius
        print "graph_title ZFS usage for zpool $zpool\n";
182
        print "graph_info This graph shows used bytes of zpool $zpool\n";
183
    }
184 5ebdabf4 Kenyon Ralph
    print "graph_args --base 1024 --lower-limit 0 --rigid\n";
185 05710b1f Claudius
    print "graph_vlabel bytes \n";
186 65652aa0 dipohl
    print "graph_category fs\n";
187 05710b1f Claudius
    print "graph_order @order\n";
188 5ebdabf4 Kenyon Ralph
189 05710b1f Claudius
    foreach my $key ( keys %{$filesystems->{$fs}}) {
190
        if ( $key ne "type" ) {
191
            if ( $filesystems->{$fs}->{type} eq "volume" && $key =~ /quota/ ) {
192
            }
193
            elsif ($filesystems->{$fs}->{type} eq "filesystem" && $key eq "volsize") {
194
            }
195
            else {
196
                print "$key.label $key\n";
197
                print "$key.min 0\n";
198
                print "$key.type GAUGE\n";
199
                print "$key.info $properties->{$key}\n";
200
                if ( $key =~ /quota|referenced|^(ref)*reservation|^used$|volsize/ ) {
201
                    print "$key.draw LINE3\n";
202
                }
203
                else {
204
                    print "$key.draw AREASTACK\n";
205
                }
206
            }
207
        }
208
    }
209
}
210
211
212
sub do_fetch_fs {
213
    my ($fs) = @_;
214
215
    if ( $fs ne $zpool ) {
216 cde12172 Stig Sandbeck Mathisen
        printf( "multigraph zfs_usage_%s.%s\n",
217
            clean_fieldname($zpool), clean_fieldname($fs) );
218 05710b1f Claudius
    } else {
219 cde12172 Stig Sandbeck Mathisen
        printf( "multigraph zfs_usage_%s\n", clean_fieldname($zpool) );
220 05710b1f Claudius
    }
221
222
    foreach my $key ( keys %{$filesystems->{$fs}}) {
223
        if ( $key ne "type" ) {
224
            if ( $filesystems->{$fs}->{type} eq "volume" && $key =~ /quota/ ) {
225
            }
226
            elsif ($filesystems->{$fs}->{type} eq "filesystem" && $key eq "volsize") {
227
            }
228
            else {
229
                print "$key.value $filesystems->{$fs}->{$key}\n";
230
            }
231
        }
232
    }
233
}
234
235
sub do_config {
236
    foreach my $fs ( sort keys %{$filesystems}) {
237
        do_config_fs($fs);
238
    }
239
}
240
241
sub do_autoconf {
242 5ebdabf4 Kenyon Ralph
    if (`which $zpoolexec 2>/dev/null` =~ m{^/}) {
243
        print "yes\n";
244
    } else {
245
        print "no ($zpoolexec could not be found)\n";
246
    }
247
    exit 0;
248 05710b1f Claudius
}
249
250
251
sub do_suggest {
252
    my $poollist=(`zpool list -H  -o name`);
253
    print "$poollist";
254
}
255
256
sub do_fetch {
257
    foreach my $fs ( sort keys %{$filesystems}) {
258
        do_fetch_fs($fs);
259
    }
260
}
261
262
sub do_setpool {
263
    if ( $0 =~ /zfs_usage_$/) {
264
        die ("Can't run without a symlinked name\n")
265
    }
266
    elsif ($0 =~ /zfs_usage_(.+)*$/) {
267
        $zpool = $1;
268
    }
269
}
270
271
if ($ARGV[0]) {
272
    if ($ARGV[0] eq "config") {
273 5ebdabf4 Kenyon Ralph
        do_setpool();
274
        do_collect();
275
        do_config();
276
        exit 0;
277 05710b1f Claudius
    }
278
    elsif ($ARGV[0] eq "autoconf") {
279
        do_autoconf();
280
        exit 0;
281
    }
282
    elsif ($ARGV[0] eq "suggest") {
283
        do_suggest();
284
        exit 0;
285
    }
286 5ebdabf4 Kenyon Ralph
}
287 05710b1f Claudius
else {
288 5ebdabf4 Kenyon Ralph
    do_setpool();
289
    do_collect();
290
    do_fetch();
291 05710b1f Claudius
}
292
293
exit 0;
294
295
__END__