Verificação de Status ReplicaSet MongoDB com Python
Published: 2023-08-23 00:51:19

Este artigo apresenta um código simples que pode ser usado para auxiliar na verificação de status do replicaset MongoDB utilizando python.

```
Requisitos: 

- Python 2.7 ou posterior
- Pymongo
```

Abaixo o script Python usado:
Nesse exemplo estamos considerando que temos 3 servidores no conjunto de replicaset com os seguintes nomes **(SVRMONGO030, SVRMONGO031 e SVRMONGO032)** e usamos um usuário criado somente com a role **clusterMonitor**.

```
#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import io   
from sys import exit
from pymongo import MongoClient

#funcao de limpeza do terminal
def cleanScreen():

        # For Windows
        if os.name == 'nt':
                os.system('cls')

        # For macOS and Linux
        else:
                os.system('clear')


#funcao de verificacao do status do replicaset mongodb
def replsetstatus():

        print('\n###############################################################\n')
        #client = MongoClient('mongodb://127.0.0.1:27017/') #localhost
        user = 'user.cluster.monitor' #user cluster monitor
        pwd = 'pwd.user.cluster.monitor' #password user cluster monitor
        client = MongoClient('mongodb://' + user + ':' + pwd + '@ipdns_server01:27017,ipdns_server02:27017,ipdns_server03:27017/')
        db = client ['admin']
        nserver = [0, 1, 2]
        rs_stats = db.command({'replSetGetStatus': 1})

        for x in nserver:
                hostnameSrv = 'SVRMONGO03' + str(x)
                IpSrv = rs_stats["members"][x]["name"]
                health = rs_stats["members"][x]["health"]
                state = rs_stats["members"][x]["state"]
                statusRepl = rs_stats["members"][x]["stateStr"]
                optimeDate = rs_stats["members"][x]["optimeDate"]

                if statusRepl == "PRIMARY":
                        syncSourceHost = "IsPrimary"
                else:
                        syncSourceHost = rs_stats["members"][x]["syncSourceHost"]
            
                print ("\nHost: {0} \nIP Server: {1} \nstateStr: {2} \nstate: {3} \nhealth: {4} \noptimeDate: {5} \nsyncSourceHost: {6} \n".format(str(hostnameSrv), str(IpSrv), str(statusRepl), str(state), str(health), str(optimeDate), str(syncSourceHost)))

        print('\n###############################################################\n')
        client.close()
    
## função inicial 
def main():
    cleanScreen()
    replsetstatus()
    input("Pressione Enter para nova verificacao. ")
    main()

#inicio da aplicacao
if __name__ == "__main__":
    main()


```


Abaixo uma versão mais simples do script que pode ser usado em conjunto com o Zabbix para monitoramento de status do replicaset e envio de alertas pelo Zabbix em casos que o status do replicaset de determinado servidor for diferente do previamente esperado, por exemplo, casos em que o primário caia ou se torne um secundário e outro assuma como primário, basta fazer a chamada do script pelo Zabbix usando o recurso de UserParameter passando na chamada do script o indicador de cada servidor que no caso do nosso exemplo é:
**0 - (SVRMONGO030)**
**1 - (SVRMONGO031)**
**2 - (SVRMONGO032)**

**Exemplos:** 
python verifyStatusReplSet.py 0
python verifyStatusReplSet.py 1
python verifyStatusReplSet.py 2

```
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from pymongo import MongoClient

def replsetstatus(nserver):
    # VARIAVEL DE INDICACAO DO SERVIDOR - nserver
	# 0 - (SVRMONGO030) | 1 - (SVRMONGO031) | - 2 (SVRMONGO032)

	# VARIAVEIS DE CONEXAO
    user = 'user.cluster.monitor'
    pwd = 'pwd.user.cluster.monitor'

    client = MongoClient('mongodb://' + user + ':' + pwd + '@ipdns_server01:27017,ipdns_server02:27017,ipdns_server03:27017/')
    db = client ['admin']
    rs_stats = db.command({'replSetGetStatus': 1})
    statusRepl= rs_stats["members"][nserver]["stateStr"]
    print (str(statusRepl))

if __name__ == "__main__":
    nserver = int(sys.argv[1])
    replsetstatus(nserver)

```

Até a próxima !!!