Compare commits
No commits in common. "422e86f0a7c87bc670a1f668d948b482057d9593" and "6c67de3bc96de2875ed85cc2b06aa5381905ee64" have entirely different histories.
422e86f0a7
...
6c67de3bc9
|
@ -12,52 +12,34 @@ db = psycopg2.connect('')
|
||||||
csr = db.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
csr = db.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||||||
|
|
||||||
csr.execute(
|
csr.execute(
|
||||||
"""
|
"""
|
||||||
with recursive
|
with recursive t as (
|
||||||
t as (
|
select '2 minutes'::interval as d
|
||||||
select '2 minutes'::interval as d
|
union
|
||||||
union
|
select d * 2 from t where d < '1 year'::interval
|
||||||
select d * 2 from t where d < '1 year'::interval
|
),
|
||||||
),
|
a as (
|
||||||
fs as (
|
select distinct hostname, filesystem, min(ts), max(ts)
|
||||||
select distinct hostname, filesystem
|
from df, t
|
||||||
from df
|
where ts >= now() - t.d
|
||||||
where ts >= now() - '2 minutes'::interval
|
group by hostname, filesystem, t.d
|
||||||
group by hostname, filesystem
|
),
|
||||||
),
|
forecast as (
|
||||||
forecast as (
|
select
|
||||||
select
|
a.hostname, a.filesystem,
|
||||||
fs.hostname, fs.filesystem,
|
c.ts - b.ts as d,
|
||||||
new.ts + (new.ts - old.ts) as when,
|
c.ts + (c.ts - b.ts) as when,
|
||||||
new.ts + (new.ts - old.ts) - now() as d,
|
c.f_used + (c.f_used - b.f_used) as used,
|
||||||
new.f_used + (new.f_used - old.f_used) as used,
|
(c.f_used + (c.f_used - b.f_used)) / b.f_usable * 100 as percent,
|
||||||
(new.f_used + (new.f_used - old.f_used)) / old.f_usable * 100 as percent,
|
(c.f_used + (c.f_used - b.f_used)) > b.f_usable as capacity_exceeded
|
||||||
(new.f_used + (new.f_used - old.f_used)) > old.f_usable as capacity_exceeded
|
from a
|
||||||
from fs, t,
|
join df b on (a.hostname = b.hostname and a.filesystem = b.filesystem and a.min = b.ts)
|
||||||
lateral (
|
join df c on (a.hostname = c.hostname and a.filesystem = c.filesystem and a.max = c.ts)
|
||||||
select *
|
)
|
||||||
from df
|
select * from forecast
|
||||||
where
|
where capacity_exceeded
|
||||||
df.hostname = fs.hostname
|
order by 1, 2, 3
|
||||||
and df.filesystem = fs.filesystem
|
"""
|
||||||
and df.ts >= now() - t.d
|
|
||||||
order by ts
|
|
||||||
limit 1
|
|
||||||
) old,
|
|
||||||
lateral (
|
|
||||||
select *
|
|
||||||
from df
|
|
||||||
where
|
|
||||||
df.hostname = fs.hostname
|
|
||||||
and df.filesystem = fs.filesystem
|
|
||||||
order by ts desc
|
|
||||||
limit 1
|
|
||||||
) new
|
|
||||||
)
|
|
||||||
select * from forecast
|
|
||||||
where capacity_exceeded
|
|
||||||
order by "when"
|
|
||||||
"""
|
|
||||||
)
|
)
|
||||||
|
|
||||||
status = 0
|
status = 0
|
||||||
|
|
|
@ -12,52 +12,34 @@ db = psycopg2.connect('')
|
||||||
csr = db.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
csr = db.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||||||
|
|
||||||
csr.execute(
|
csr.execute(
|
||||||
"""
|
"""
|
||||||
with recursive
|
with recursive t as (
|
||||||
t as (
|
select '2 minutes'::interval as d
|
||||||
select '2 minutes'::interval as d
|
union
|
||||||
union
|
select d * 2 from t where d < '1 year'::interval
|
||||||
select d * 2 from t where d < '1 year'::interval
|
),
|
||||||
),
|
a as (
|
||||||
fs as (
|
select distinct hostname, filesystem, min(ts), max(ts)
|
||||||
select distinct hostname, filesystem
|
from df, t
|
||||||
from df
|
where ts >= now() - t.d
|
||||||
where ts >= now() - '2 minutes'::interval
|
group by hostname, filesystem, t.d
|
||||||
group by hostname, filesystem
|
),
|
||||||
),
|
forecast as (
|
||||||
forecast as (
|
select
|
||||||
select
|
a.hostname, a.filesystem,
|
||||||
fs.hostname, fs.filesystem,
|
c.ts - b.ts as d,
|
||||||
new.ts + (new.ts - old.ts) as when,
|
c.ts + (c.ts - b.ts) as when,
|
||||||
new.ts + (new.ts - old.ts) - now() as d,
|
c.s_used + (c.s_used - b.s_used) as used,
|
||||||
new.s_used + (new.s_used - old.s_used) as used,
|
(c.s_used + (c.s_used - b.s_used)) / b.s_usable * 100 as percent,
|
||||||
(new.s_used + (new.s_used - old.s_used)) / old.s_usable * 100 as percent,
|
(c.s_used + (c.s_used - b.s_used)) > b.s_usable as capacity_exceeded
|
||||||
(new.s_used + (new.s_used - old.s_used)) > old.s_usable as capacity_exceeded
|
from a
|
||||||
from fs, t,
|
join df b on (a.hostname = b.hostname and a.filesystem = b.filesystem and a.min = b.ts)
|
||||||
lateral (
|
join df c on (a.hostname = c.hostname and a.filesystem = c.filesystem and a.max = c.ts)
|
||||||
select *
|
)
|
||||||
from df
|
select * from forecast
|
||||||
where
|
where capacity_exceeded
|
||||||
df.hostname = fs.hostname
|
order by 1, 2, 3
|
||||||
and df.filesystem = fs.filesystem
|
"""
|
||||||
and df.ts >= now() - t.d
|
|
||||||
order by ts
|
|
||||||
limit 1
|
|
||||||
) old,
|
|
||||||
lateral (
|
|
||||||
select *
|
|
||||||
from df
|
|
||||||
where
|
|
||||||
df.hostname = fs.hostname
|
|
||||||
and df.filesystem = fs.filesystem
|
|
||||||
order by ts desc
|
|
||||||
limit 1
|
|
||||||
) new
|
|
||||||
)
|
|
||||||
select * from forecast
|
|
||||||
where capacity_exceeded
|
|
||||||
order by "when"
|
|
||||||
"""
|
|
||||||
)
|
)
|
||||||
|
|
||||||
status = 0
|
status = 0
|
||||||
|
|
52
df2db
52
df2db
|
@ -12,38 +12,34 @@ csr = db.cursor()
|
||||||
with open("/proc/mounts") as mounts:
|
with open("/proc/mounts") as mounts:
|
||||||
for mount in mounts:
|
for mount in mounts:
|
||||||
(dev, mountpoint, fstype, rest) = mount.split(' ', 3)
|
(dev, mountpoint, fstype, rest) = mount.split(' ', 3)
|
||||||
try:
|
s = os.statvfs(mountpoint)
|
||||||
s = os.statvfs(mountpoint)
|
if s.f_blocks == 0:
|
||||||
if s.f_blocks == 0:
|
continue # not a real file system
|
||||||
continue # not a real file system
|
|
||||||
|
|
||||||
s_total = s.f_blocks * s.f_bsize
|
s_total = s.f_blocks * s.f_bsize
|
||||||
s_usable = (s.f_blocks - s.f_bfree + s.f_bavail) * s.f_bsize
|
s_usable = (s.f_blocks - s.f_bfree + s.f_bavail) * s.f_bsize
|
||||||
s_used = (s.f_blocks - s.f_bfree) * s.f_bsize
|
s_used = (s.f_blocks - s.f_bfree) * s.f_bsize
|
||||||
|
|
||||||
f_total = s.f_files
|
f_total = s.f_files
|
||||||
f_usable = s.f_files - s.f_ffree + s.f_favail
|
f_usable = s.f_files - s.f_ffree + s.f_favail
|
||||||
f_used = s.f_files - s.f_ffree
|
f_used = s.f_files - s.f_ffree
|
||||||
|
|
||||||
csr.execute(
|
csr.execute(
|
||||||
"""
|
"""
|
||||||
insert into df(
|
insert into df(
|
||||||
hostname, filesystem,
|
hostname, filesystem,
|
||||||
s_total, s_usable, s_used,
|
|
||||||
f_total, f_usable, f_used
|
|
||||||
)
|
|
||||||
values (
|
|
||||||
%s, %s,
|
|
||||||
%s, %s, %s,
|
|
||||||
%s, %s, %s
|
|
||||||
)
|
|
||||||
""",
|
|
||||||
(hostname, mountpoint,
|
|
||||||
s_total, s_usable, s_used,
|
s_total, s_usable, s_used,
|
||||||
f_total, f_usable, f_used))
|
f_total, f_usable, f_used
|
||||||
except PermissionError:
|
)
|
||||||
# silently ignore some errors
|
values (
|
||||||
pass
|
%s, %s,
|
||||||
|
%s, %s, %s,
|
||||||
|
%s, %s, %s
|
||||||
|
)
|
||||||
|
""",
|
||||||
|
(hostname, mountpoint,
|
||||||
|
s_total, s_usable, s_used,
|
||||||
|
f_total, f_usable, f_used))
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue