root / plugins / mongodb / mongo_lag @ c6f88968
Historique | Voir | Annoter | Télécharger (2,21 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 | 276169a6 | Alban | =head1 AUTHOR |
| 24 | |||
| 25 | c6f88968 | Lars Kruse | Stefan Andersen <stefan@stefanandersen.dk> |
| 26 | |||
| 27 | Updated by Alban Espie-Guillon <alban.espie@alterway.fr> |
||
| 28 | 276169a6 | Alban | |
| 29 | =head1 LICENSE |
||
| 30 | c6f88968 | Lars Kruse | |
| 31 | The Beer Ware License (Revision 42) |
||
| 32 | <alban.espie@alterway.fr> wrote this file. As long |
||
| 33 | as you retain this notice you can do whatever you want |
||
| 34 | with this stuff. If we meet some day, and you think |
||
| 35 | this stuff is worth it, you can buy me a beer in return. |
||
| 36 | |||
| 37 | SPDX-License-Identifier: Beerware |
||
| 38 | |||
| 39 | =cut |
||
| 40 | 1199e0d0 | Stefan Andersen | """ |
| 41 | c6f88968 | Lars Kruse | |
| 42 | 1199e0d0 | Stefan Andersen | import os |
| 43 | import sys |
||
| 44 | import pymongo |
||
| 45 | |||
| 46 | def _get_members(): |
||
| 47 | host = os.environ.get('host', '127.0.0.1')
|
||
| 48 | port = os.environ.get('port', 27017)
|
||
| 49 | 8fc3d29d | Alban | username = os.environ.get('username', '')
|
| 50 | password = os.environ.get('password', '')
|
||
| 51 | 1357b818 | Alban | conn = pymongo.MongoClient(host, int(port)) |
| 52 | 8fc3d29d | Alban | if username: |
| 53 | connAuth = conn['admin'] |
||
| 54 | connAuth.authenticate(username, password) |
||
| 55 | 276169a6 | Alban | |
| 56 | 923e134d | Alban | repl_status = conn.admin.command("replSetGetStatus")
|
| 57 | 1199e0d0 | Stefan Andersen | |
| 58 | members = {}
|
||
| 59 | for member in repl_status['members']: |
||
| 60 | ea5dde3f | jdponomarev | if member['stateStr'] != 'ARBITER' : |
| 61 | name = member['name'].split('.')[0]
|
||
| 62 | members[name] = {'state': member['state'], 'optimeDate': member['optimeDate']}
|
||
| 63 | 1199e0d0 | Stefan Andersen | return members |
| 64 | |||
| 65 | def run(): |
||
| 66 | members = _get_members(); |
||
| 67 | for member in members: |
||
| 68 | if members[member]['state'] == 1: |
||
| 69 | primary_optime = members[member]['optimeDate'] |
||
| 70 | |||
| 71 | for member in members: |
||
| 72 | 6f7f6a09 | Stefan Andersen | lag = (primary_optime - members[member]['optimeDate']).seconds |
| 73 | 276169a6 | Alban | print("{0}.value {1}".format(member, lag))
|
| 74 | 1199e0d0 | Stefan Andersen | |
| 75 | def config(): |
||
| 76 | 276169a6 | Alban | print("""graph_title MongoDB replication lag
|
| 77 | 1199e0d0 | Stefan Andersen | graph_args --base 1000 |
| 78 | graph_vlabel Replication lag (seconds) |
||
| 79 | 99542938 | dipohl | graph_category db |
| 80 | 276169a6 | Alban | """) |
| 81 | 17f78427 | Lars Kruse | |
| 82 | 1199e0d0 | Stefan Andersen | for member in _get_members(): |
| 83 | 276169a6 | Alban | print("{0}.label {0}".format(member))
|
| 84 | 1199e0d0 | Stefan Andersen | |
| 85 | if __name__ == "__main__": |
||
| 86 | if len(sys.argv) > 1 and sys.argv[1] == "config": |
||
| 87 | config() |
||
| 88 | else: |
||
| 89 | run() |
