Various Tutorials
  • About
  • Tutorials
    • 1. Instance for deployment
      • Create instance
      • Install and configure OCI CLI
      • OCI CLI small test
      • Install and configure Terraform
      • Terraform - small test
    • 2. OCI Networking &Terraform
      • 2.1 VCN (basics)
        • 2.1.1 Create a virtual network using Start VCN Wizard
        • 2.1.2 VCN & public subnet (step-by-step in Terraform)
        • 2.1.3 VCN & public subnet (new compartment)
        • 2.1.4 VCN, Terraform and Ansible (Nginx example)
        • 2.1.5 VCN & private subnet (step-by-step in Terraform)
      • 2.2
      • 2.3
    • 3. Untitled
    • 4. Untitled
    • 5. ATP and APEX
      • Setup Autonomous Database
        • Deploying ATP using OCI Interface
        • Deploy with OCI CLI
      • Setup APEX on ATP
      • Connect remotely to ATP
      • ATP, APEX and Jupyter
      • Demo
    • 6. MySQL
      • 6.1. The basics - OCI UI (MySQL DB System)
      • 6.2 The basics - OCI CLI (MySQL DB System)
      • 6.3 Access MySQL DB System
      • 6.4 HeatWave and MySQL DB Service
      • 6.5 Python SDK
      • 6.6 MySQL Replication (Compute Instances)
      • 6.7 Monitoring MySQL instances
        • Deploy MySQL instances
        • Monitoring tools
          • 1. Networking setup
          • 2. Prometheus setup
          • 3. MySQL Prometheus Exporter Setup
          • 4. Grafana setup
          • 5. Grafana metric graphs
    • 7. MySQL OCI &Terraform
      • 7.1 Deploy MySQL DB System with Terraform (basic tutorial)
      • 7.2 Deploy MySQL DB System with Terraform and access the system
      • 7.3 Endpoints
      • 7.4 Channels (troubleshooting)
        • Fixed MySQL source - MDS replication
      • 7.5 Channels (code)
Powered by GitBook
On this page
  • 3.1 Install MySQL Prometheus Exporter
  • 3.2 Configure MySQL Prometheus Exporter
  • 3.3 Before loading and enabling Systemd Exporter
  • 3.3 Start Exporter services and perform checking:
  1. Tutorials
  2. 6. MySQL
  3. 6.7 Monitoring MySQL instances
  4. Monitoring tools

3. MySQL Prometheus Exporter Setup

Previous2. Prometheus setupNext4. Grafana setup

Last updated 4 years ago

Prometheus must have implemented a MySQL Exporter in order to fetch the metrics from the MySQL systems.

3.1 Install MySQL Prometheus Exporter

3.1.1 Download the latest version of MySQL Exporter from their official repository:

root@deploymentmachine:/home# curl -s https://github.com/prometheus/mysqld_exporter/releases | grep latest
<div class="release pt-2 pt-md-0 pb-3 pb-md-0 clearfix label-latest">
            <a class="border-0 Label--outline-green" href="/prometheus/mysqld_exporter/releases/latest">Latest release</a>
              <a class="border-0 Label--outline-green" href="/prometheus/mysqld_exporter/releases/latest">Latest release</a>
root@deploymentmachine:/home#

... better use github endoipoints...

root@deploymentmachine:/home# curl -s https://api.github.com/repos/prometheus/mysqld_exporter/releases/latest  |\
grep browser_download_url |\
grep linux-amd64.tar.gz |\
awk '{gsub(/"/, "", $2); print $2}' | wget -qi -
root@deploymentmachine:/home# ls -ltr my*
-rw-r--r-- 1 root root 7121565 Jul 29  2019 mysqld_exporter-0.12.1.linux-amd64.tar.gz

3.2 ... and untar for extracting files:

root@deploymentmachine:/home# tar xvf mysqld_exporter-0.12.1.linux-amd64.tar.gz
mysqld_exporter-0.12.1.linux-amd64/
mysqld_exporter-0.12.1.linux-amd64/NOTICE
mysqld_exporter-0.12.1.linux-amd64/mysqld_exporter
mysqld_exporter-0.12.1.linux-amd64/LICENSE
root@deploymentmachine:/home# 
root@deploymentmachine:/home# 
root@deploymentmachine:/home# ls my*
mysqld_exporter-0.12.1.linux-amd64.tar.gz

mysqld_exporter-0.12.1.linux-amd64:
LICENSE  NOTICE  mysqld_exporter

3.3 Move mysqld_exporter under /usr/local/bin, and make it executable:

 root@deploymentmachine:/home# mv  my*.linux-amd64/mysqld_exporter /usr/local/bin/
 root@deploymentmachine:/home# chmod +x /usr/local/bin/mysqld_exporter

3.2 Configure MySQL Prometheus Exporter

3.2.1 Create Exporter user to access databases

We have deployed 3 MySQL systems with following private IPs: 10.0.0.28, 10.0.0.30, 10.0.0.32

We need to create an Exporter user on every MySQL data, and grant it permissions:

a) On MySQL system 10.0.0.28 (log into the system using mysqlsh)

root@deploymentmachine:~# mysqlsh usertest@10.0.0.28:3306
Please provide the password for 'usertest@10.0.0.28:3306': ***********
 MySQL  10.0.0.28:3306 ssl  JS >
 MySQL  10.0.0.28:3306 ssl  JS > \sql
Switching to SQL mode... Commands end with ;
 MySQL  10.0.0.28:3306 ssl  SQL >
 MySQL  10.0.0.28:3306 ssl  SQL > CREATE USER 'user_exporter'@'%' IDENTIFIED BY 'Passw0rdStr0nk' WITH MAX_USER_CONNECTIONS 2;
Query OK, 0 rows affected (0.0201 sec)
 MySQL  10.0.0.28:3306 ssl  SQL > GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'user_exporter'@'%';
Query OK, 0 rows affected (0.0034 sec)
 MySQL  10.0.0.28:3306 ssl  SQL >
 MySQL  10.0.0.28:3306 ssl  SQL > \exit
 Bye!

b) On MySQL system 10.0.0.30 (log into the system using mysqlsh)

root@deploymentmachine:~# mysqlsh usertest@10.0.0.30:3306
Please provide the password for 'usertest@10.0.0.30:3306': ***********
 MySQL  10.0.0.30:3306 ssl  JS >
 MySQL  10.0.0.30:3306 ssl  JS > \sql
Switching to SQL mode... Commands end with ;
 MySQL  10.0.0.30:3306 ssl  SQL >
 MySQL  10.0.0.30:3306 ssl  SQL > CREATE USER 'user_exporter'@'%' IDENTIFIED BY 'Passw0rdStr0nk' WITH MAX_USER_CONNECTIONS 2;
Query OK, 0 rows affected (0.0201 sec)
 MySQL  10.0.0.30:3306 ssl  SQL >
 MySQL  10.0.0.30:3306 ssl  SQL > GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'user_exporter'@'%';
Query OK, 0 rows affected (0.0034 sec)
 MySQL  10.0.0.30:3306 ssl  SQL >
 MySQL  10.0.0.30:3306 ssl  SQL > \exit
 Bye!

c) On MySQL system 10.0.0.32 (log into the system using mysqlsh)

root@deploymentmachine:~# mysqlsh usertest@10.0.0.32:3306
Please provide the password for 'usertest@10.0.0.32:3306': ***********
 MySQL  10.0.0.32:3306 ssl  JS >
 MySQL  10.0.0.32:3306 ssl  JS > \sql
Switching to SQL mode... Commands end with ;
 MySQL  10.0.0.32:3306 ssl  SQL >
 MySQL  10.0.0.32:3306 ssl  SQL > CREATE USER 'user_exporter'@'%' IDENTIFIED BY 'Passw0rdStr0nk' WITH MAX_USER_CONNECTIONS 2;
Query OK, 0 rows affected (0.0201 sec)
 MySQL  10.0.0.32:3306 ssl  SQL >
 MySQL  10.0.0.32:3306 ssl  SQL > GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'user_exporter'@'%';
Query OK, 0 rows affected (0.0034 sec)
 MySQL  10.0.0.32:3306 ssl  SQL >
 MySQL  10.0.0.32:3306 ssl  SQL > \exit
 Bye!

3.2.2 Configure Exporter files on the host where Prometheus is installed

Since we have 3 hosts, each host needs its own configuration file for an Exporter service. (this seems to be a normal behavior for MySQL Exporter )

For the configuration files (/etc/.mysqld_exporter.cnf, for instance), you need to provide same MySQL user (along with its password) that you have provided at step 3.2.1. Also, the host is the private IP of the database:

root@deploymentmachine:/home# more /etc/.mysqld_exporter.cnf
[client]
user=user_exporter
password=Passw0rdStr0nk
host=10.0.0.28
root@deploymentmachine:/home# more /etc/.mysqld_exporter_1.cnf
[client]
user=user_exporter
password=Passw0rdStr0nk
host=10.0.0.30
root@deploymentmachine:/home# more /etc/.mysqld_exporter_2.cnf
[client]
user=user_exporter
password=Passw0rdStr0nk
host=10.0.0.32
root@deploymentmachine:/home#

Once you have created all three configuration files, change the ownership:

root@deploymentmachine:/home# chown root:prometheus /etc/.mysqld_exporter.cnf
root@deploymentmachine:/home# chown root:prometheus /etc/.mysqld_exporter_1.cnf
root@deploymentmachine:/home# chown root:prometheus /etc/.mysqld_exporter_2.cnf

3.2.3. Configure Systemd for Exporter

At this step, as you have guessed it, we need three different configuration files for Systemd. Pay attention to ports. The port for Exporter is 9104. Since we need 3 different Exporter services, we will provide three different ports in every mysql_exporter.service file: 9104, 9105, 9106

  • Systemd file that will use /etc/.mysqld_exporter.cnf && port 9104

root@deploymentmachine:/home# more /etc/systemd/system/mysql_exporter.service
[Unit]
 Description=Prometheus MySQL Exporter
 After=network.target
 User=prometheus
 Group=prometheus

 [Service]
 Type=simple
 Restart=always
 ExecStart=/usr/local/bin/mysqld_exporter \
 --config.my-cnf /etc/.mysqld_exporter.cnf \
 --collect.global_status \
 --collect.info_schema.innodb_metrics \
 --collect.auto_increment.columns \
 --collect.info_schema.processlist \
 --collect.binlog_size \
 --collect.info_schema.tablestats \
 --collect.global_variables \
 --collect.info_schema.query_response_time \
 --collect.info_schema.userstats \
 --collect.info_schema.tables \
 --collect.perf_schema.tablelocks \
 --collect.perf_schema.file_events \
 --collect.perf_schema.eventswaits \
 --collect.perf_schema.indexiowaits \
 --collect.perf_schema.tableiowaits \
 --collect.slave_status \
 --web.listen-address=0.0.0.0:9104

 [Install]
 WantedBy=multi-user.target
  • Systemd file that will use /etc/.mysqld_exporter_1.cnf && port 9105

root@deploymentmachine:/home# more /etc/systemd/system/mysql_exporter_1.service
[Unit]
 Description=Prometheus MySQL Exporter
 After=network.target
 User=prometheus
 Group=prometheus

 [Service]
 Type=simple
 Restart=always
 ExecStart=/usr/local/bin/mysqld_exporter \
 --config.my-cnf /etc/.mysqld_exporter_1.cnf \
 --collect.global_status \
 --collect.info_schema.innodb_metrics \
 --collect.auto_increment.columns \
 --collect.info_schema.processlist \
 --collect.binlog_size \
 --collect.info_schema.tablestats \
 --collect.global_variables \
 --collect.info_schema.query_response_time \
 --collect.info_schema.userstats \
 --collect.info_schema.tables \
 --collect.perf_schema.tablelocks \
 --collect.perf_schema.file_events \
 --collect.perf_schema.eventswaits \
 --collect.perf_schema.indexiowaits \
 --collect.perf_schema.tableiowaits \
 --collect.slave_status \
 --web.listen-address=0.0.0.0:9105

 [Install]
 WantedBy=multi-user.target
  • Systemd file that will use /etc/.mysqld_exporter_2.cnf && port 9106

root@deploymentmachine:/home# more /etc/systemd/system/mysql_exporter_2.service
[Unit]
 Description=Prometheus MySQL Exporter
 After=network.target
 User=prometheus
 Group=prometheus

 [Service]
 Type=simple
 Restart=always
 ExecStart=/usr/local/bin/mysqld_exporter \
 --config.my-cnf /etc/.mysqld_exporter_2.cnf \
 --collect.global_status \
 --collect.info_schema.innodb_metrics \
 --collect.auto_increment.columns \
 --collect.info_schema.processlist \
 --collect.binlog_size \
 --collect.info_schema.tablestats \
 --collect.global_variables \
 --collect.info_schema.query_response_time \
 --collect.info_schema.userstats \
 --collect.info_schema.tables \
 --collect.perf_schema.tablelocks \
 --collect.perf_schema.file_events \
 --collect.perf_schema.eventswaits \
 --collect.perf_schema.indexiowaits \
 --collect.perf_schema.tableiowaits \
 --collect.slave_status \
 --web.listen-address=0.0.0.0:9106

 [Install]
 WantedBy=multi-user.target

3.3 Before loading and enabling Systemd Exporter

This has two parts - networking changes and Prometheus changes

3.3.1 Networking changes

Since we are using new ports, we need to make a few changes:

3.3.1.1 In the Cloud

Add following ingress rules for ports 9104, 9105, respectively 9106:

... and the final result

3.3.1.2 On the host

Make sure you open the ports for listening:

root@deploymentmachine:/home# firewall-cmd --add-port=9104/tcp --permanent
success
root@deploymentmachine:/home# firewall-cmd --add-port=9105/tcp --permanent
success
root@deploymentmachine:/home# firewall-cmd --add-port=9106/tcp --permanent
success
root@deploymentmachine:/home# firewall-cmd --reload
success
root@deploymentmachine:/home#

3.3.1 Prometheus changes

Add the following changes for scrape_configs field in the /etc/prometheus/prometheus.yml file:

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'mysql_server1'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9104']

  - job_name: 'mysql_server2'
    static_configs:
    - targets: ['localhost:9105']

  - job_name: 'mysql_server3'
    static_configs:
    - targets: ['localhost:9106']

  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']

Load changes and restart prometheus service:

root@deploymentmachine:/home# systemctl daemon-reload
root@deploymentmachine:/home# systemctl restart prometheus

Now we are ready to start the three Exporter services

3.3 Start Exporter services and perform checking:

root@deploymentmachine:/home# systemctl daemon-reload
root@deploymentmachine:/home# systemctl enable mysql_exporter.service
root@deploymentmachine:/home# systemctl enable mysql_exporter_1.service
root@deploymentmachine:/home# systemctl enable mysql_exporter_2.service
root@deploymentmachine:/home# systemctl start mysql_exporter.service
root@deploymentmachine:/home# systemctl start mysql_exporter_1.service
root@deploymentmachine:/home# systemctl start mysql_exporter_2.service

Check if MySQL Exporter is listening on the three ports:

root@deploymentmachine:/home# lsof -i :9104  | grep -i listen
COMMAND     PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld_ex 20292       root    3u  IPv6 234242      0t0  TCP *:9104 (LISTEN)
root@deploymentmachine:/home# lsof -i :9105  | grep -i listen 
COMMAND     PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld_ex 20308       root    3u  IPv6 234288      0t0  TCP *:9105 (LISTEN)
root@deploymentmachine:/home# lsof -i :9106  | grep -i listen
COMMAND     PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld_ex 20752       root    3u  IPv6 239749      0t0  TCP *:9106 (LISTEN)

Check in browser if mysql metric names are showing up in Prometheus:

If you require details on how to login to OCI Mysql using mysql-shell, check tutorial

"Access MySQL Instance"
Releases · prometheus/mysqld_exporterGitHub
Logo