Projet

Général

Profil

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

root / plugins / mongodb / mongo_lag @ dca09431

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

1 276169a6 Alban
#!/usr/bin/env python3
2 1199e0d0 Stefan Andersen
"""
3 276169a6 Alban
=head1 NAME
4 1199e0d0 Stefan Andersen
5 c6f88968 Lars Kruse
mongo_lag - MongoDB Replication Lag
6
7
Connects to a single mongo instance and retrieve replication lag for all connected members.
8 1199e0d0 Stefan Andersen
9 276169a6 Alban
=head1 APPLICABLE SYSTEMS
10
11 c6f88968 Lars Kruse
MongoDB 3.X and 4.X with pymongo installed.
12 276169a6 Alban
13
=head1 CONFIGURATION
14
15 c6f88968 Lars Kruse
Default for host is 127.0.0.1 and port 27017 and will work without being defined:
16 276169a6 Alban
17 8fc3d29d Alban
    [mongo_lag]
18 1199e0d0 Stefan Andersen
    env.host 127.0.0.1
19
    env.port 27017
20 8fc3d29d Alban
    env.username user
21
    env.password P@55w0rd
22 1199e0d0 Stefan Andersen
23 bc55ce69 Jeremías
or
24 95e525db Jeremías
25
    [mongo_lag]
26
    env.MONGO_DB_URI mongodb://user:passwd@127.0.0.1:27017
27
28 276169a6 Alban
=head1 AUTHOR
29
30 c6f88968 Lars Kruse
Stefan Andersen <stefan@stefanandersen.dk>
31
32
Updated by Alban Espie-Guillon <alban.espie@alterway.fr>
33 276169a6 Alban
34
=head1 LICENSE
35 c6f88968 Lars Kruse
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 1199e0d0 Stefan Andersen
"""
46 c6f88968 Lars Kruse
47 1199e0d0 Stefan Andersen
import os
48
import sys
49
import pymongo
50
51
def _get_members():
52 95e525db Jeremías
    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 276169a6 Alban
64 923e134d Alban
    repl_status = conn.admin.command("replSetGetStatus")
65 1199e0d0 Stefan Andersen
66
    members = {}
67
    for member in repl_status['members']:
68 ea5dde3f jdponomarev
        if member['stateStr'] != 'ARBITER' :
69
            name = member['name'].split('.')[0]
70
            members[name] = {'state': member['state'], 'optimeDate': member['optimeDate']}
71 1199e0d0 Stefan Andersen
    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 6f7f6a09 Stefan Andersen
        lag = (primary_optime - members[member]['optimeDate']).seconds
81 276169a6 Alban
        print("{0}.value {1}".format(member, lag))
82 1199e0d0 Stefan Andersen
83
def config():
84 276169a6 Alban
    print("""graph_title MongoDB replication lag
85 1199e0d0 Stefan Andersen
graph_args --base 1000
86
graph_vlabel Replication lag (seconds)
87 99542938 dipohl
graph_category db
88 276169a6 Alban
""")
89 17f78427 Lars Kruse
90 1199e0d0 Stefan Andersen
    for member in _get_members():
91 276169a6 Alban
        print("{0}.label {0}".format(member))
92 1199e0d0 Stefan Andersen
93
if __name__ == "__main__":
94
    if len(sys.argv) > 1 and sys.argv[1] == "config":
95
        config()
96
    else:
97
        run()