Postgres 代理¶
Postgres 代理过滤器解码 Postgres 客户端(下游)和 Postgres 服务端(上游)之间的连接协议。解码后的信息会被用于生成 Postgres 级别的统计信息,例如其中的会话、语句和已执行的事务等。Postgres 代理过滤器还会解析 Query
和 Parse
消息中携带的 SQL 查询。
当成功解析 SQL 查询后, 元数据:ref:metadata <config_network_filters_postgres_proxy_dynamic_metadata> 会被创建, 这个元数据可能会被其他过滤器使用,比如 RBAC 。
当 Postgres 过滤器检测到会话已加密的时候,消息会被忽略并且不会进行解码。更多信息:
Postgres 架构概述
Attention
postgres_proxy 过滤器是实验性的,目前正在积极开发中。 功能会随着时间的推移而扩展,并且配置结构也可能会发生变化。
Warning
postgreql_proxy 过滤器仅使用 Postgres frontend/backend protocol version 3.0 测试过, 这个版本在 Postgres 7.4 被引入。因此不支持早期版本。无论如何,测试只限于非最终(EOL-ed)版本。
配置¶
Postgres 代理过滤器应该与 TCP 代理串联在一起使用,如以下配置示例所示:
filter_chains:
- filters:
- name: envoy.filters.network.postgres_proxy
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.postgres_proxy.v3alpha.PostgresProxy
stat_prefix: postgres
- name: envoy.tcp_proxy
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
stat_prefix: tcp
cluster: postgres_cluster
统计¶
每个配置的 Postgres 代理过滤器都有如下基于 postgres.<stat_prefix> 的统计信息:
名称 |
类型 |
描述 |
---|---|---|
errors |
Counter |
服务器回复 ERROR message 的次数 |
errors_error |
Counter |
服务器回复 ERROR message 和 ERROR severity 的次数 |
errors_fatal |
Counter |
服务器回复 ERROR message 和 FATAL severity 的次数 |
errors_panic |
Counter |
服务器回复 ERROR message 和 PANIC severity 的次数 |
errors_unknown |
Counter |
服务器回复 ERROR message 但解码器无法解析它的次数 |
messages |
Counter |
过滤器处理的消息总数 |
messages_backend |
Counter |
过滤器检测到的后端消息总数 |
messages_frontend |
Counter |
过滤器检测到的前端消息数 |
messages_unknown |
Counter |
过滤器成功解码但不知道如何处理消息的次数 |
sessions |
Counter |
成功登陆总数 |
sessions_encrypted |
Counter |
过滤器检测到加密会话的次数 |
sessions_unencrypted |
Counter |
表示未加密成功登录的消息数 |
statements |
Counter |
SQL语句总数 |
statements_delete |
Counter |
DELETE 语句数 |
statements_insert |
Counter |
INSERT 语句数 |
statements_select |
Counter |
SELECT 语句数 |
statements_update |
Counter |
UPDATE 语句数 |
statements_other |
Counter |
“除 DELETE,INSERT,SELECT 或 UPDATE 以外的语句数” |
statements_parsed |
Counter |
成功解析的 SQL 查询数 |
statements_parse_error |
Counter |
未成功解析的 SQL 查询数 |
transactions |
Counter |
SQL事务总数 |
transactions_commit |
Counter |
COMMIT 事务数 |
transactions_rollback |
Counter |
ROLLBACK 事务数 |
notices |
Counter |
NOTICE 消息总数 |
notices_notice |
Counter |
带有 NOTICE subtype 的 NOTICE 消息数 |
notices_log |
Counter |
带有 LOG subtype 的 NOTICE 消息数 |
notices_warning |
Counter |
带有 WARNING severity 的 NOTICE 消息数 |
notices_debug |
Counter |
带有 DEBUG severity 的 NOTICE 消息数 |
notices_info |
Counter |
带有 INFO severity 的 NOTICE 消息数 |
notices_unknown |
Counter |
无法识别的 NOTICE 消息数 |
动态元数据¶
Postgres 过滤器根据 Query
和 Parse
消息中携带的 SQL 语句发出动态元数据。statements_parsed
统计计数器追踪有多少次 SQL 语句被成功解析,并创建元数据。这个元数据会以以下的格式发出:
名称 |
类型 |
描述 |
---|---|---|
<table.db> |
string |
table.db 格式的资源名称。 |
[] |
list |
表示在资源上执行的操作的字符串列表。操作可以是 insert/update/select/drop/delete/create/alter/show 操作之一。 |
Attention
当前使用的解析器无法成功解析所有的 SQL 语句,并且不能假定所有的 SQL 查询都会成功生成动态元数据。
目前基于 SQL 查询创建动态元数据是在尽力而为的基础上。如果解析 SQL 查询失败,statements_parse_error
计数值会增加,并且创建日志消息,动态元数据不会生成,但是 Postgres 消息会继续转发到上游 Postgres 服务器。
可以通过设置 enable_sql_parsing 为 false 来禁用 解析 SQL 语句和发出动态元数据。