Projet

Général

Profil

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

root / plugins / mongodb / mongo_lag @ bc55ce69

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

1
#!/usr/bin/env python3
2
"""
3
=head1 NAME
4

    
5
mongo_lag - MongoDB Replication Lag
6

    
7
Connects to a single mongo instance and retrieve replication lag for all connected members.
8

    
9
=head1 APPLICABLE SYSTEMS
10

    
11
MongoDB 3.X and 4.X with pymongo installed.
12

    
13
=head1 CONFIGURATION
14

    
15
Default for host is 127.0.0.1 and port 27017 and will work without being defined:
16

    
17
    [mongo_lag]
18
    env.host 127.0.0.1
19
    env.port 27017
20
    env.username user
21
    env.password P@55w0rd
22

    
23
or
24

    
25
    [mongo_lag]
26
    env.MONGO_DB_URI mongodb://user:passwd@127.0.0.1:27017
27

    
28
=head1 AUTHOR
29

    
30
Stefan Andersen <stefan@stefanandersen.dk>
31

    
32
Updated by Alban Espie-Guillon <alban.espie@alterway.fr>
33

    
34
=head1 LICENSE
35

    
36
The Beer Ware License (Revision 42)
37
<alban.espie@alterway.fr> wrote this file. As long
38
as you retain this notice you can do whatever you want
39
with this stuff. If we meet some day, and you think
40
this stuff is worth it, you can buy me a beer in return.
41

    
42
SPDX-License-Identifier: Beerware
43

    
44
=cut
45
"""
46

    
47
import os
48
import sys
49
import pymongo
50

    
51
def _get_members():
52
    if 'MONGO_DB_URI' in os.environ:
53
        conn = pymongo.MongoClient(os.environ['MONGO_DB_URI'])
54
    else:
55
        host = os.environ.get('host', '127.0.0.1')
56
        port = os.environ.get('port', 27017)
57
        username = os.environ.get('username', '')
58
        password = os.environ.get('password', '')
59
        conn = pymongo.MongoClient(host, int(port))
60
        if username:
61
            connAuth = conn['admin']
62
            connAuth.authenticate(username, password)
63

    
64
    repl_status = conn.admin.command("replSetGetStatus")
65

    
66
    members = {}
67
    for member in repl_status['members']:
68
        if member['stateStr'] != 'ARBITER' :
69
            name = member['name'].split('.')[0]
70
            members[name] = {'state': member['state'], 'optimeDate': member['optimeDate']}
71
    return members
72

    
73
def run():
74
    members = _get_members();
75
    for member in members:
76
        if members[member]['state'] == 1:
77
            primary_optime = members[member]['optimeDate']
78

    
79
    for member in members:
80
        lag = (primary_optime - members[member]['optimeDate']).seconds
81
        print("{0}.value {1}".format(member, lag))
82

    
83
def config():
84
    print("""graph_title MongoDB replication lag
85
graph_args --base 1000
86
graph_vlabel Replication lag (seconds)
87
graph_category db
88
""")
89

    
90
    for member in _get_members():
91
        print("{0}.label {0}".format(member))
92

    
93
if __name__ == "__main__":
94
    if len(sys.argv) > 1 and sys.argv[1] == "config":
95
        config()
96
    else:
97
        run()