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() |
