PMM2 nos proporciona una solución completa de monitorización de nuestros servidores pero hay ocasiones en las que esta información debe ser consultada por algún equipo externo, Grafana solventa este problema mediante las organizaciones, de este modo podremos tener dashboards específicas por organización.
Vamos a utilizar una herramienta llamada wizzy ya que nos facilita mucho la vida para realizar copias de dashboards y posteriormente cargarlas. Se trata de una herramienta escrita en NodeJs así que instalamos npm, en mi caso bajo FreeBSD:
npm install -g wizzy
Creamos un directorio donde guardaremos las dashboards y toda la información obtenida de Grafana:
cd pmm2/
Inicializamos el repositorio de Git y realizamos la configuración de conexión contra el servidor de Grafana:
wizzy init
wizzy set grafana url http://grafana.alfaexploit.com/graph
wizzy set grafana username admin
wizzy set grafana password PASSWORD
wizzy status
Mostramos las organizaciones actuales:
Output:
[
{
"id": 1,
"name": "Main Org."
}
]
Nos aseguramos de estar en la main org:
{
"message": "Active organization changed"
}
✔ Org switched to 1 successfully.
Nos bajamos las datasources configuradas:
✔ Total datasources imported: 3
✔ Datasources import successful.
Si solo queremos una:
Consultamos las datasources que nos hemos bajado:
Output:
┌──────────────────────────────┬──────────────────────────────┐
│ Datasource Name │ Datasource Type │
├──────────────────────────────┼──────────────────────────────┤
│ ClickHouse │ vertamedia-clickhouse-datas… │
├──────────────────────────────┼──────────────────────────────┤
│ PostgreSQL │ postgres │
├──────────────────────────────┼──────────────────────────────┤
│ Prometheus │ prometheus │
└──────────────────────────────┴──────────────────────────────┘
✔ Total datasources: 3
✔ Showed datasources summary successfully.
Listamos las dashboards disponibles:
Output:
┌──────────────────────────────┬──────────────────────────────┬──────────────────────────────┬──────────────────────────────┬──────────────────────────────┐
│ Title │ Slug │ ID / UID │ Type │ folderTitle │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Insight │ insight │ 3 / QxVaaQuWk │ dash-folder │ │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MongoDB │ mongodb │ 2 / mxVaawXWz │ dash-folder │ │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL │ mysql │ 5 / vBV-aQXZz │ dash-folder │ │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ OS │ os │ 7 / QL4a-wXWk │ dash-folder │ │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ PMM │ pmm │ 6 / kY4a-QXWz │ dash-folder │ │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ PostgreSQL │ postgresql │ 1 / G14aawuZk │ dash-folder │ │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Query Analytics │ query-analytics │ 4 / A-V-awXZk │ dash-folder │ │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Advanced Data Exploration │ advanced-data-exploration │ 71 / 1oz9QMHmk │ dash-db │ Insight │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ CPU Utilization Details │ cpu-utilization-details │ 87 / node-cpu │ dash-db │ OS │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Disk Details │ disk-details │ 111 / node-disk │ dash-db │ OS │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Home Dashboard │ home-dashboard │ 66 / pmm-home │ dash-db │ Insight │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Memory Details │ memory-details │ 103 / node-memory │ dash-db │ OS │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MongoDB Cluster Summary │ mongodb-cluster-summary │ 95 / mongodb-cluster-summary │ dash-db │ MongoDB │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MongoDB InMemory Details │ mongodb-inmemory-details │ 85 / mongodb-inmemory │ dash-db │ MongoDB │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MongoDB Instance Summary │ mongodb-instance-summary │ 84 / mongodb-instance-summa… │ dash-db │ MongoDB │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MongoDB Instances Compare │ mongodb-instances-compare │ 109 / mongodb-instance-comp… │ dash-db │ MongoDB │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MongoDB Instances Overview │ mongodb-instances-overview │ 106 / mongodb-instance-over… │ dash-db │ MongoDB │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MongoDB MMAPv1 Details │ mongodb-mmapv1-details │ 72 / mongodb-mmapv1 │ dash-db │ MongoDB │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MongoDB ReplSet Summary │ mongodb-replset-summary │ 91 / mongodb-replicaset-sum… │ dash-db │ MongoDB │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MongoDB RocksDB Details │ mongodb-rocksdb-details │ 90 / mongodb-rocksdb │ dash-db │ MongoDB │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MongoDB WiredTiger Details │ mongodb-wiredtiger-details │ 80 / mongodb-wiredtiger │ dash-db │ MongoDB │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL Amazon Aurora Details │ mysql-amazon-aurora-details │ 70 / mysql-amazonaurora │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL Command/Handler Count… │ mysql-command-handler-count… │ 68 / mysql-commandhandler-c… │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL InnoDB Compression De… │ mysql-innodb-compression-de… │ 67 / mysql-innodb-compressi… │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL InnoDB Details │ mysql-innodb-details │ 94 / mysql-innodb │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL Instance Summary │ mysql-instance-summary │ 77 / mysql-instance-summary │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL Instances Compare │ mysql-instances-compare │ 108 / mysql-instance-compare │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL Instances Overview │ mysql-instances-overview │ 105 / mysql-instance-overvi… │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL MyISAM/Aria Details │ mysql-myisam-aria-details │ 89 / mysql-myisamaria │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL MyRocks Details │ mysql-myrocks-details │ 75 / mysql-myrocks │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL Performance Schema De… │ mysql-performance-schema-de… │ 82 / mysql-performance-sche… │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL Query Response Time D… │ mysql-query-response-time-d… │ 76 / mysql-queryresponsetime │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL Replication Summary │ mysql-replication-summary │ 98 / mysql-replicaset-summa… │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL Table Details │ mysql-table-details │ 96 / mysql-table │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL TokuDB Details │ mysql-tokudb-details │ 93 / mysql-tokudb │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL User Details │ mysql-user-details │ 86 / mysql-user │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ MySQL Wait Event Analyses D… │ mysql-wait-event-analyses-d… │ 83 / mysql-waitevents-analy… │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Network Details │ network-details │ 99 / node-network │ dash-db │ OS │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Node Summary │ node-summary │ 88 / node-instance-summary │ dash-db │ OS │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Node Temperature Details │ node-temperature-details │ 112 / node-temp │ dash-db │ OS │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Nodes Compare │ nodes-compare │ 100 / node-instance-compare │ dash-db │ OS │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Nodes Overview │ nodes-overview │ 102 / node-instance-overview │ dash-db │ OS │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ NUMA Details │ numa-details │ 97 / node-memory-numa │ dash-db │ OS │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ PMM Add Instance │ pmm-add-instance │ 65 / pmm-add-instance │ dash-db │ PMM │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ PMM Inventory │ pmm-inventory │ 63 / pmm-inventory │ dash-db │ PMM │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ PMM Query Analytics │ pmm-query-analytics │ 62 / pmm-qan │ dash-db │ Query Analytics │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ PMM Settings │ pmm-settings │ 64 / pmm-settings │ dash-db │ PMM │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ PostgreSQL Instance Summary │ postgresql-instance-summary │ 101 / postgresql-instance-s… │ dash-db │ PostgreSQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ PostgreSQL Instances Compare │ postgresql-instances-compare │ 110 / postgresql-instance-c… │ dash-db │ PostgreSQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ PostgreSQL Instances Overvi… │ postgresql-instances-overvi… │ 107 / postgresql-instance-o… │ dash-db │ PostgreSQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Processes Details │ processes-details │ 104 / node-cpu-process │ dash-db │ OS │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Prometheus │ prometheus │ 81 / prometheus │ dash-db │ Insight │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Prometheus Exporter Status │ prometheus-exporter-status │ 69 / prometheus-status │ dash-db │ Insight │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Prometheus Exporters Overvi… │ prometheus-exporters-overvi… │ 79 / prometheus-overview │ dash-db │ Insight │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ ProxySQL Instance Summary │ proxysql-instance-summary │ 78 / proxysql-instance-summ… │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ PXC/Galera Cluster Summary │ pxc-galera-cluster-summary │ 92 / pxc-cluster-summary │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ PXC/Galera Node Summary │ pxc-galera-node-summary │ 73 / pxc-node-summary │ dash-db │ MySQL │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ PXC/Galera Nodes Compare │ pxc-galera-nodes-compare │ 74 / pxc-nodes-compare │ dash-db │ MySQL │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
✔ Total dashboards: 58
✔ Displayed dashboards list successfully.
Nos bajamos a local las dashboards:
Importing 51 dashboards:
✔ Dashboard advanced-data-exploration imported successfully.
✔ Dashboard cpu-utilization-details imported successfully.
✔ Dashboard disk-details imported successfully.
✔ Dashboard home-dashboard imported successfully.
✔ Dashboard memory-details imported successfully.
✔ Dashboard mongodb-cluster-summary imported successfully.
✔ Dashboard mongodb-inmemory-details imported successfully.
✔ Dashboard mongodb-instance-summary imported successfully.
✔ Dashboard mongodb-instances-compare imported successfully.
✔ Dashboard mongodb-instances-overview imported successfully.
✔ Dashboard mongodb-mmapv1-details imported successfully.
✔ Dashboard mongodb-replset-summary imported successfully.
✔ Dashboard mongodb-rocksdb-details imported successfully.
✔ Dashboard mongodb-wiredtiger-details imported successfully.
✔ Dashboard mysql-amazon-aurora-details imported successfully.
✔ Dashboard mysql-command-handler-counters-compare imported successfully.
✔ Dashboard mysql-innodb-compression-details imported successfully.
✔ Dashboard mysql-innodb-details imported successfully.
✔ Dashboard mysql-instance-summary imported successfully.
✔ Dashboard mysql-instances-compare imported successfully.
✔ Dashboard mysql-instances-overview imported successfully.
✔ Dashboard mysql-myisam-aria-details imported successfully.
✔ Dashboard mysql-myrocks-details imported successfully.
✔ Dashboard mysql-performance-schema-details imported successfully.
✔ Dashboard mysql-query-response-time-details imported successfully.
✔ Dashboard mysql-replication-summary imported successfully.
✔ Dashboard mysql-table-details imported successfully.
✔ Dashboard mysql-tokudb-details imported successfully.
✔ Dashboard mysql-user-details imported successfully.
✔ Dashboard mysql-wait-event-analyses-details imported successfully.
✔ Dashboard network-details imported successfully.
✔ Dashboard node-summary imported successfully.
✔ Dashboard node-temperature-details imported successfully.
✔ Dashboard nodes-compare imported successfully.
✔ Dashboard nodes-overview imported successfully.
✔ Dashboard numa-details imported successfully.
✔ Dashboard pmm-add-instance imported successfully.
✔ Dashboard pmm-inventory imported successfully.
✔ Dashboard pmm-query-analytics imported successfully.
✔ Dashboard pmm-settings imported successfully.
✔ Dashboard postgresql-instance-summary imported successfully.
✔ Dashboard postgresql-instances-compare imported successfully.
✔ Dashboard postgresql-instances-overview imported successfully.
✔ Dashboard processes-details imported successfully.
✔ Dashboard prometheus imported successfully.
✔ Dashboard prometheus-exporter-status imported successfully.
✔ Dashboard prometheus-exporters-overview imported successfully.
✔ Dashboard proxysql-instance-summary imported successfully.
✔ Dashboard pxc-galera-cluster-summary imported successfully.
✔ Dashboard pxc-galera-node-summary imported successfully.
✔ Dashboard pxc-galera-nodes-compare imported successfully.
✔ 51 dashboards imported successfully.
Si solo queremos una:
Creamos una organización nueva:
Output:
{
"message": "Organization created",
"orgId": 14
}
✔ Created Grafana org alfaexploit successfully.
Mostramos de nuevo las organizaciones:
Output:
[
{
"id": 1,
"name": "Main Org."
},
{
"id": 14,
"name": "alfaexploit"
}
]
Cambiamos de organización para subir las datasources/dashboards:
Output:
{
"message": "Active organization changed"
}
✔ Org switched to 14 successfully.
Añadimos la datasource:
Datasource does not exists in Grafana.
Trying to create a new datasource.
Output:
{
"datasource": {
"id": 11,
"orgId": 14,
"name": "Prometheus",
"type": "prometheus",
"typeLogoUrl": "",
"access": "proxy",
"url": "http://127.0.0.1:9090/prometheus/",
"password": "",
"user": "",
"database": "",
"basicAuth": false,
"basicAuthUser": "",
"basicAuthPassword": "",
"withCredentials": false,
"isDefault": true,
"jsonData": {
"httpMethod": "POST",
"keepCookies": [],
"timeInterval": "1s"
},
"secureJsonFields": {},
"version": 1,
"readOnly": false
},
"id": 11,
"message": "Datasource added",
"name": "Prometheus"
}
✔ Datasource Prometheus export successful.
En mi caso solo me interesan unas cuantas dashboards, antes de cargarlas eliminamos los links del query analytics y demás ya que no queremos que nadie tenga acceso:
for DASH in OS/cpu-utilization-details OS/memory-details OS/disk-details MySQL/mysql-instance-summary MongoDB/mongodb-instance-summary; do
jq 'del(.links)' dashboards/$DASH.json > /tmp/grafana.json
mv /tmp/grafana.json dashboards/$DASH.json
done
Tendremos que retocar las queries de las dashboards para que en los desplegables solo aparezcan los servidores que queremos que sean visibles en esa organización, según la dashboard habrá que retocarla de una manera u otra, en mi caso solo quiero que se vean los servidores llamados kr0mtest*:
"label_values({__name__=~\"node_boot_time_seconds|rdsosmetrics_timestamp\"}, node_name)"
"label_values({__name__=~\"node_boot_time_seconds|rdsosmetrics_timestamp\", node_name=~\"kr0mtest.*\"}, node_name)"
"label_values(up{node_type=~\"generic|remote_rds|container|remote\"}, node_name)"
"label_values(up{node_type=~\"generic|remote_rds|container|remote\", node_name=~\"kr0mtest.*\"}, node_name)"
"label_values({__name__=~\"node_disk_reads_completed_total|aws_rds_disk_queue_depth_average|rdsosmetrics_diskIO_readLatency\"}, node_name)")
"label_values({__name__=~\"node_disk_reads_completed_total|aws_rds_disk_queue_depth_average|rdsosmetrics_diskIO_readLatency\", node_name=~\"kr0mtest.*\"}, node_name)"
"label_values(mysql_up{node_name=~\"$node_name\"}, node_name)"
"label_values(mysql_up{node_name=~\"$node_name\", node_name=~\"kr0mtest.*\"}, node_name)"
"label_values(mongodb_up{node_name=~\"$node_name\"}, node_name)"
"label_values(mongodb_up{node_name=~\"$node_name\", node_name=~\"kr0mtest.*\"}, node_name)"
Subimos las dashboards:
wizzy export dashboard OS/cpu-utilization-details
wizzy export dashboard OS/memory-details
wizzy export dashboard OS/disk-details
wizzy export dashboard MySQL/mysql-instance-summary
wizzy export dashboard MongoDB/mongodb-instance-summary
wizzy no permite la administración de usuarios así que los crearemos manualmente, podríamos utilizar la API pero para ello deberíamos generar una apikey y no lo considero necesario si vamos a crear pocos usuarios:
Server Admin -> Users
New user
Rellenamos los datos:
Hacemos click encima del usuario:
Le asignamos la organización nueva como viewer y eliminamos la main org:
Si hacemos login con el usuario podemos ver que solo tiene acceso a las métricas de los servidores kr0mtest* y no puede editar las dashboards: