MySQL filter

In this example, we show how the MySQL filter can be used with the Envoy proxy.

The Envoy proxy configuration includes a MySQL filter that parses queries and collects MySQL-specific metrics.

Note

The current implementation of the protocol filter was tested extensively with MySQL v5.7. It may also work with other versions. This example uses the current latest version.

Step 1: Build the sandbox

Change to the examples/mysql directory.

Build and start the containers.

$ pwd
envoy/examples/mysql
$ docker compose pull
$ docker compose up --build -d
$ docker compose ps

    Name                   Command               State                             Ports
----------------------------------------------------------------------------------------------------
mysql_mysql_1   docker-entrypoint.sh mysqld      Up      3306/tcp
mysql_proxy_1   /docker-entrypoint.sh /bin       Up      10000/tcp, 1999/tcp, 0.0.0.0:8001->8001/tcp

Step 2: Issue commands using mysql

Use mysql to issue some commands and verify they are routed via Envoy.

$ docker run --rm -it --network mysql_default mysql:5.7 mysql -h proxy -P 1999 -u root --skip-ssl
... snip ...

mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec)

mysql> USE test;
Database changed
mysql> CREATE TABLE test ( text VARCHAR(255) );
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT COUNT(*) FROM test;
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+
1 row in set (0.01 sec)

mysql> INSERT INTO test VALUES ('hello, world!');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT COUNT(*) FROM test;
+----------+
| COUNT(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

mysql> exit
Bye

Step 3: Check egress stats

Check egress stats were updated.

$ curl -s "http://localhost:8001/stats?filter=egress_mysql"
mysql.egress_mysql.auth_switch_request: 0
mysql.egress_mysql.decoder_errors: 0
mysql.egress_mysql.login_attempts: 1
mysql.egress_mysql.login_failures: 0
mysql.egress_mysql.protocol_errors: 0
mysql.egress_mysql.queries_parse_error: 2
mysql.egress_mysql.queries_parsed: 7
mysql.egress_mysql.sessions: 6
mysql.egress_mysql.upgraded_to_ssl: 0

Step 4: Check TCP stats

Check TCP stats were updated.

$ curl -s "http://localhost:8001/stats?filter=mysql_tcp"
tcp.mysql_tcp.downstream_cx_no_route: 0
tcp.mysql_tcp.downstream_cx_rx_bytes_buffered: 0
tcp.mysql_tcp.downstream_cx_rx_bytes_total: 446
tcp.mysql_tcp.downstream_cx_total: 1
tcp.mysql_tcp.downstream_cx_tx_bytes_buffered: 0
tcp.mysql_tcp.downstream_cx_tx_bytes_total: 677
tcp.mysql_tcp.downstream_flow_control_paused_reading_total: 0
tcp.mysql_tcp.downstream_flow_control_resumed_reading_total: 0
tcp.mysql_tcp.idle_timeout: 0
tcp.mysql_tcp.max_downstream_connection_duration: 0
tcp.mysql_tcp.upstream_flush_active: 0
tcp.mysql_tcp.upstream_flush_total: 0

See also

Envoy MySQL filter

Learn more about using the Envoy MySQL filter.

Envoy admin quick start guide

Quick start guide to the Envoy admin interface.

MySQL

The MySQL database.