|
1 | | -#!/usr/bin/env python |
| 1 | +#!/usr/bin/env python3 |
2 | 2 | # Copyright European Organization for Nuclear Research (CERN) 2013 |
3 | 3 | # |
4 | 4 | # Licensed under the Apache License, Version 2.0 (the "License"); |
|
8 | 8 | # Authors: |
9 | 9 | # - Vincent Garonne, <vincent.garonne@cern.ch>, 2015 |
10 | 10 | # - Cedric Serfon, <cedric.serfon@cern.ch>, 2018 |
| 11 | +# - Maggie Voetberg, <maggiev@fnal.gov>, 2024 |
11 | 12 |
|
12 | 13 | ''' |
13 | 14 | Probe to check the backlog of obsolete replicas. |
14 | 15 | ''' |
15 | 16 |
|
16 | 17 | import sys |
| 18 | +import traceback |
| 19 | +from sqlalchemy.sql import text |
| 20 | +from rucio.db.sqla.session import BASE, get_session |
| 21 | +from utils.common import PrometheusPusher |
17 | 22 |
|
18 | | -from rucio.db.sqla.session import get_session |
| 23 | +if BASE.metadata.schema: |
| 24 | + schema = BASE.metadata.schema + '.' |
| 25 | +else: |
| 26 | + schema = '' |
19 | 27 |
|
20 | 28 | # Exit statuses |
21 | 29 | OK, WARNING, CRITICAL, UNKNOWN = 0, 1, 2, 3 |
22 | 30 |
|
23 | 31 |
|
24 | 32 | if __name__ == "__main__": |
25 | 33 | try: |
26 | | - SESSION = get_session() |
27 | | - QUERY = '''BEGIN |
28 | | - FOR u in (SELECT |
29 | | - a.rse_id AS rse_id, |
30 | | - NVL(b.files, 0) AS files, |
31 | | - NVL(b.bytes, 0) AS bytes, |
32 | | - SYS_EXTRACT_UTC(localtimestamp) AS updated_at |
33 | | - FROM |
34 | | - ( |
35 | | - SELECT |
36 | | - id AS rse_id |
37 | | - FROM |
38 | | - atlas_rucio.rses |
39 | | - WHERE |
40 | | - deleted=0) a |
41 | | - LEFT OUTER JOIN |
42 | | - ( |
43 | | - SELECT |
44 | | - /*+ INDEX_FFS(replicas REPLICAS_TOMBSTONE_IDX) */ |
45 | | - rse_id, |
46 | | - COUNT(1) AS files, |
47 | | - SUM(bytes) AS bytes |
48 | | - FROM |
49 | | - atlas_rucio.replicas |
50 | | - WHERE |
51 | | - ( |
52 | | - CASE |
53 | | - WHEN tombstone IS NOT NULL |
54 | | - THEN rse_id |
55 | | - END) IS NOT NULL |
56 | | - AND tombstone=to_date('1-1-1970 00:00:00','MM-DD-YYYY HH24:Mi:SS') |
57 | | - GROUP BY |
58 | | - rse_id) b |
59 | | - ON |
60 | | - a.rse_id=b.rse_id) |
| 34 | + session = get_session() |
| 35 | + with PrometheusPusher() as manager: |
| 36 | + query = '''BEGIN |
| 37 | + FOR u in (SELECT |
| 38 | + a.rse_id AS rse_id, |
| 39 | + NVL(b.files, 0) AS files, |
| 40 | + NVL(b.bytes, 0) AS bytes, |
| 41 | + SYS_EXTRACT_UTC(localtimestamp) AS updated_at |
| 42 | + FROM |
| 43 | + ( |
| 44 | + SELECT |
| 45 | + id AS rse_id |
| 46 | + FROM |
| 47 | + {schema}rses |
| 48 | + WHERE |
| 49 | + deleted=0) a |
| 50 | + LEFT OUTER JOIN |
| 51 | + ( |
| 52 | + SELECT |
| 53 | + /*+ INDEX_FFS(replicas REPLICAS_TOMBSTONE_IDX) */ |
| 54 | + rse_id, |
| 55 | + COUNT(1) AS files, |
| 56 | + SUM(bytes) AS bytes |
| 57 | + FROM |
| 58 | + {schema}replicas |
| 59 | + WHERE |
| 60 | + ( |
| 61 | + CASE |
| 62 | + WHEN tombstone IS NOT NULL |
| 63 | + THEN rse_id |
| 64 | + END) IS NOT NULL |
| 65 | + AND tombstone=to_date('1-1-1970 00:00:00','MM-DD-YYYY HH24:Mi:SS') |
| 66 | + GROUP BY |
| 67 | + rse_id) b |
| 68 | + ON |
| 69 | + a.rse_id=b.rse_id) |
61 | 70 |
|
62 | | - LOOP |
63 | | - MERGE INTO atlas_rucio.RSE_USAGE |
64 | | - USING DUAL |
65 | | - ON (atlas_rucio.RSE_USAGE.rse_id = u.rse_id and source = 'obsolete') |
66 | | - WHEN NOT MATCHED THEN INSERT(rse_id, source, used, files, updated_at, created_at) |
67 | | - VALUES (u.rse_id, 'obsolete', u.bytes, u.files, u.updated_at, u.updated_at) |
68 | | - WHEN MATCHED THEN UPDATE SET used=u.bytes, files=u.files, updated_at=u.updated_at; |
| 71 | + LOOP |
| 72 | + MERGE INTO {schema}RSE_USAGE |
| 73 | + USING DUAL |
| 74 | + ON ({schema}RSE_USAGE.rse_id = u.rse_id and source = 'obsolete') |
| 75 | + WHEN NOT MATCHED THEN INSERT(rse_id, source, used, files, updated_at, created_at) |
| 76 | + VALUES (u.rse_id, 'obsolete', u.bytes, u.files, u.updated_at, u.updated_at) |
| 77 | + WHEN MATCHED THEN UPDATE SET used=u.bytes, files=u.files, updated_at=u.updated_at; |
69 | 78 |
|
70 | | - MERGE INTO ATLAS_RUCIO.RSE_USAGE_HISTORY H |
71 | | - USING DUAL |
72 | | - ON (h.rse_id = u.rse_id and h.source = 'obsolete' and h.updated_at = u.updated_at) |
73 | | - WHEN NOT MATCHED THEN INSERT(rse_id, source, used, files, updated_at, created_at) |
74 | | - VALUES (u.rse_id, 'obsolete', u.bytes, u.files, u.updated_at, u.updated_at); |
| 79 | + MERGE INTO {schema}RSE_USAGE_HISTORY H |
| 80 | + USING DUAL |
| 81 | + ON (h.rse_id = u.rse_id and h.source = 'obsolete' and h.updated_at = u.updated_at) |
| 82 | + WHEN NOT MATCHED THEN INSERT(rse_id, source, used, files, updated_at, created_at) |
| 83 | + VALUES (u.rse_id, 'obsolete', u.bytes, u.files, u.updated_at, u.updated_at); |
75 | 84 |
|
76 | | - COMMIT; |
77 | | - END LOOP; |
78 | | -END; |
79 | | -''' |
80 | | - SESSION.execute(QUERY) |
81 | | - except Exception as error: |
82 | | - print error |
| 85 | + COMMIT; |
| 86 | + END LOOP; |
| 87 | + END;'''.format(schema=schema) |
| 88 | + |
| 89 | + for result in session.execute(text(query)): |
| 90 | + print(result) |
| 91 | + |
| 92 | + rse_id = result[0] |
| 93 | + bytes_sum = result[2] |
| 94 | + files_count = result[3] |
| 95 | + |
| 96 | + manager.gauge(name="obsolete_replicas_files.{rse}", |
| 97 | + documentation="Probe to check the backlog of obsolete replicas.").labels(rse=rse_id).set(files_count) |
| 98 | + |
| 99 | + manager.gauge(name="obsolete_replicas_bytes.{rse}", |
| 100 | + documentation="Probe to check the backlog of obsolete replicas.").labels().set(bytes_sum) |
| 101 | + |
| 102 | + |
| 103 | + except: |
| 104 | + print(traceback.format_exc()) |
83 | 105 | sys.exit(UNKNOWN) |
| 106 | + finally: |
| 107 | + session.remove() |
84 | 108 | sys.exit(OK) |
0 commit comments