Prakata

Sebelum mengikuti tutorial ini, silahkan setup dockprom terlebih dahulu di server. Apabila sudah, baru bisa mengikuti tutorial ini


Setup Percona MongoDB Exporter dengan Docker

Sedikit catatan, saya menggunakan mongodb non Percona tapi masih bisa menggunakan percona mongodb exporter. Saya menggunakan docker untuk dibanding menginstall file binary exporter nya, anti ribet (aslinya, lama risetnya). Berikut cara setup percona mongodb exporter

  1. Buat satu file baru, docker-compose.yml isikan dengan
version: "3.3"

services:
  mongodb_exporter:
    image: percona/mongodb_exporter:0.20
    container_name: mongodb-exporter
    ports:
      - 9216:9216
    entrypoint: ["/mongodb_exporter", "--mongodb.uri=mongodb://username:password@192.168.3.69:27017/?authSource=admin", "--enable.dbstats", "--log.level=info", "--discovering-mode", "--mongodb.collstats-colls=your_main_db.*", "--mongodb.indexstats-colls=yourLovelyDatabase.*", "--mongodb.global-conn-pool", "--compatible-mode"]
                                                                                                                                  

Sebelumnya jangan lupa buat user dulu khusus untuk monitoring

db.createUser(
{	user: "cluster_monitor_user",
	pwd: "password",

	roles:[ {
         "role":"clusterMonitor",
         "db":"admin"
      },
      {
         "role":"read",
         "db":"local"
      }]});
  1. Jalankan dengan docker-compose up -d

    Deploy Percona MongoDB Exporter

    Deploy Percona MongoDB Exporter

  2. Untuk test jalan atau tidak, bisa di cek dengan curl localhost:9216/metrics


Tambahkan di Prometheus

  1. Buka file prometheus.yml (di dockprom terletak di folder dockprom/prometheus), tambahkan
  - job_name: 'mongodb'
    scrape_interval: 10s
    honor_labels: true
    static_configs:
      - targets: ['192.168.3.69:9216', '192.168.3.96:9216']
  1. Buat file mongodb.rules di folder dockprom/prometheus
#di ambil dari https://awesome-prometheus-alerts.grep.to/rules#mongodb
groups:
- name: mongodb
  rules:

  - alert: MongoDBDown
    expr: mongodb_up == 0
    for: 0m
    labels:
      severity: critical
    annotations:
      summary: MongoDB Down (instance {{ $labels.instance }})
      description: "MongoDB instance is down\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}"

  - alert: MongoDBReplicationLag
    expr: mongodb_mongod_replset_member_optime_date{state="PRIMARY"} - ON (set) mongodb_mongod_replset_member_optime_date{state="SECONDARY"} > 10
    for: 0m
    labels:
      severity: critical
    annotations:
      summary: MongoDB replication lag (instance {{ $labels.instance }})
      description: "MongoDB replication lag is more than 10s\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}"

  - alert: MongoDBReplicationHeadroom
    expr: (avg(mongodb_mongod_replset_oplog_head_timestamp - mongodb_mongod_replset_oplog_tail_timestamp) - (avg(mongodb_mongod_replset_member_optime_date{state="PRIMARY"}) - avg(mongodb_mongod_replset_member_optime_date{state="SECONDARY"}))) <= 0
    for: 0m
    labels:
      severity: critical
    annotations:
      summary: MongoDB replication headroom (instance {{ $labels.instance }})
      description: "MongoDB replication headroom is <= 0\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}"

  - alert: MongoDBNumberCursorsOpen
    expr: mongodb_mongod_metrics_cursor_open{state="total"} > 10 * 1000
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: MongoDB number cursors open (instance {{ $labels.instance }})
      description: "Too many cursors opened by MongoDB for clients (> 10k)\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}"

  - alert: MongoDBCursorsTimeouts
    expr: increase(mongodb_mongod_metrics_cursor_timed_out_total[1m]) > 100
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: MongoDB cursors timeouts (instance {{ $labels.instance }})
      description: "Too many cursors are timing out\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}"

  - alert: MongoDBTooManyConnections
    expr: avg by(instance) (rate(mongodb_connections{state="current"}[1m])) / avg by(instance) (sum (mongodb_connections) by (instance)) * 100 > 80
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: MongoDB too many connections (instance {{ $labels.instance }})
      description: "Too many connections (> 80%)\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}"

  - alert: MongoDBVirtualMemoryUsage
    expr: (sum(mongodb_memory{type="virtual"}) BY (instance) / sum(mongodb_memory{type="mapped"}) BY (instance)) > 3
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: MongoDB virtual memory usage (instance {{ $labels.instance }})
      description: "High memory usage\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}"
  1. Restart prometheus, docker restart prometheus
MongoDB Exporter di Prometheus

MongoDB Exporter di Prometheus


Setup Grafana Dashboard

Untuk grafana dashboard nya, saya menggunakan dashboard 12079

Tampilan Dashboard 12079

Tampilan Dashboard 12079

Catatan, setelah setup data tidak akan langsung muncul, tunggu beberapa menit




Jika kamu merasa tulisan ini bermanfaat & membantu kamu, kamu bisa berdonasi lewat saweria

If you feel this website help you, you can donate at saweria