新的Postgres_exporter PostgreSQL监视功能

下午好,哈伯读者!


有关posgres_exporter的第一篇文章中 ,我考虑了当时使用新的fitcha时的一种特殊情况,即由一个导出器监视一组实例和/或数据库的能力。 他描述了他遇到的问题的“束缚”,以及他使它起作用的解决方法。
因此,在11月25日,发布了下一个postgres_exporter 0.8.0版本。 它解决了上一篇文章中描述的问题,并且特别好,它添加了新功能。


我要一只猫...


首先,我想向您详细介绍postgre_exporter并编写一种简短的快速入门指南。 让我们回顾一下要点:


  1. 环境变量和启动参数
  2. 什么是默认指标?
  3. 如何添加自己的指标

内容描述


postgres_exporter-使用Go语言编写的实用工具,用于以PostgreSQL的可访问Prometheus格式收集PostgreSQL DBMS集群实例的度量,它是开源的,并且免费分发。


环境变量和命令行参数


同样,Postgres_exporter没有配置文件,所有参数都通过环境变量或命令行参数传递给导出器。 同时,只能通过环境变量来传送用于连接到DBMS的参数。


环境变量


如上所述,环境变量可以分为两组。 前者传递连接字符串,后者传递命令行参数。


让我们从第一组开始。 这些变量以前缀DATA_SOURCE_


  • DATA_SOURCE_NAME-默认使用。 允许您以=格式记录连接字符串,并以URI的形式记录,并且可以包含连接的登录名和密码。
    用于连接到PostgreSQL的有效作业选项:


    • postgresql://rolename@dbhost:dbport/datname?sslmode=disable ;
    • postgresql://rolename:rolpass@dbhost:dbport?sslmode=disable&db=datname ;
    • postgresql://rolename:rolpass@?sslmode=disable&dbname=database&host=dbhost&port=dbport ;
    • postgresql://rolename:rolpass@?sslmode=disable&dbname=database&host=/tmp (通过UNIX套接字的连接,取自PostgreSQL实例的unix_socket_directories);
    • host=dbhost port=dbport dbname=database user=rolename sslmode=disable ;

    如果需要连接到多个实例(不允许在小数点后使用空格):


    • postgresql://rolename@dbhost:dbport/datname?sslmode=disable,postgresql://rolename@dbhost:dbport/datname?sslmode=disable ;
    • sslmode=disable dbname=postgres host=127.0.0.1 port=5434 user=postgres,sslmode=disable dbname=postgres port=5432 user=postgres

  • DATA_SOURCE_URI-替代DATA_SOURCE_NAME。 仅当您打算连接到单个PostgreSQL实例时,此选项才适用。
    变量DATA_SOURCE_URI以“ dbhost:dbport / dbname?Key = value”的形式设置不带用户名和密码的URI部分。 用户名和密码取自DATA_SOURCE_USER和DATA_SOURCE_PASS环境变量,或者取自DATA_SOURCE_USER_FILE DATA_SOURCE_PASS_FILE文件。
    当用户名和密码存储在文件中时,其内容将被提取并重新分配给变量DATA_SOURCE_USER和DATA_SOURCE_PASS。 此外,在代码中,所有这些都收集在以下形式的完整URI中: "postgresql://" + DATA_SOURCE_USER + ":" + DATA_SOURCE_PASS + "@" + DATA_SOURCE_URI
  • DATA_SOURCE_URI_FILE-与DATA_SOURCE_URI相同,仅从文件读取;
  • DATA_SOURCE_USER-使用DATA_SOURCE_URI时,设置用于连接到DBMS的用户名;
  • DATA_SOURCE_USER_FILE-与DATA_SOURCE_USER相同,仅从文件读取;
  • DATA_SOURCE_PASS-使用DATA_SOURCE_URI时,设置用于连接到DBMS的用户密码;
  • DATA_SOURCE_PASS_FILE-与DATA_SOURCE_PASS相同,仅从文件;中读取。

第二组包括可变重复参数。 即 在启动时,您可以选择以环境变量的形式设置应用程序的操作参数,或者在启动时作为参数传递。 以前缀PG_EXPORTER_


  • PG_EXPORTER_WEB_LISTEN_ADDRESS-设置导出器将接收来自Prometheus的请求的地址和端口。 默认值:9187 ;
  • PG_EXPORTER_WEB_TELEMETRY_PATH-给出度量的路径。 默认/metrics ;
  • PG_EXPORTER_DISABLE_DEFAULT_METRICS-默认情况下禁用指标收集。 这些指标将在下面的事实。 仅true或false接受值。 默认情况下为False(允许指标收集);
  • PG_EXPORTER_DISABLE_SETTINGS_METRICS-禁用从pg_settings视图收集指标的功能。 这些指标将在下面的事实。 仅true或false接受值。 默认情况下为False(允许指标收集);
  • PG_EXPORTER_AUTO_DISCOVER_DATABASES-检测集群实例的所有数据库以收集其指标。 仅true或false接受值。 默认情况下为false(仅在连接参数中指定的数据库中收集指标);否则为false。
  • PG_EXPORTER_EXCLUDE_DATABASES-如果PG_EXPORTER_AUTO_DISCOVER_DATABASES=true要收集其指标的数据库列表中排除该数据库。 表示以逗号分隔的数据库名称列表。 默认值为空字符串。 重要提示
    • 模板template0和template1-无需排除,因此在从pg_databases获取数据库列表的阶段将其切断;
    • 不能排除URI中指定的数据库。
  • PG_EXPORTER_EXTEND_QUERY_PATH-包含用户查询的YAML文件的路径。 query.yaml文件包含示例。
  • PG_EXPORTER_CONSTANT_LABELS-标签(常量)已添加到所有指标。 它被写为一个==对的列表,以逗号分隔。

命令行参数


  • web.listen-address与PG_EXPORTER_WEB_LISTEN_ADDRESS相同;
  • web.telemetry-path-与PG_EXPORTER_WEB_TELEMETRY_PATH相同;
  • disable-default-metrics与PG_EXPORTER_DISABLE_DEFAULT_METRICS相同;
  • disable-settings-metrics与PG_EXPORTER_DISABLE_SETTINGS_METRICS相同;
  • 自动发现数据库与PG_EXPORTER_AUTO_DISCOVER_DATABASES相同;
  • exclude-databases与PG_EXPORTER_EXCLUDE_DATABASES相同;
  • extend.query-path-与PG_EXPORTER_EXTEND_QUERY_PATH相同;
  • constantLabels-与PG_EXPORTER_CONSTANT_LABELS相同;
  • dumpmaps-显示指标图的内部内容。 用于调试用户请求。 不启动应用程序;
  • log.level-设置可能的日志记录级别之一: debuginfowarnerrorfatal
  • log.format-设置日志输出的方法和格式。 例如: logger:syslog?appname=bob&local=7logger:stdout?json=true 。 默认情况下, logger:stderr

默认指标


-度量标准是一组监视度量标准,它们的集合直接在代码中列出。 可以通过指定命令行参数--disable-default-metrics和/或--disable-settings-metrics或定义适当的环境变量来禁用 -的收集。
我注意到,在当前版本中,启用自动发现后解决了使用指标的问题,这是因为指标重复,从而导致错误。


默认情况下,以下视图中的指标将发送到监视:


  • pg_stat_bgwriter;
  • pg_stat_database;
  • pg_stat_database_conflicts;
  • pg_locks;
  • pg_stat_replication;
  • pg_stat_activity;
  • pg_settings。

您应注意的是pg_stat_replication和pg_stat_activity,因为返回的字段集取决于PostgreSQL的版本。 为此,在导出器中检查DBMS版本,并选择相应的请求。 您不能在用户查询中指定版本。 假定管理员事先知道将监视实例的版本。 如果您尝试由一个导出者从不同版本的实例中收集指标,也会出现问题。
使用实例设置指标(pg_settings),一切都变得更加简单,它们由请求组成:


 SELECT name, setting, COALESCE(unit, ''), short_desc, vartype FROM pg_settings WHERE vartype IN ('bool', 'integer', 'real'); 

因此,默认情况下,仅由数值形成一组度量。


此外,我们将考虑出口商的结论,包括我们将如何理解为何硬编码指标具有其存在权。 例如,采用两个指标:shared_buffers和wal_sender_timeout。 在导出器的输出中,对于每个指标,我们得到三行。
第一行-表示提示,由postgres_exporter中的度量名称,描述(pg_settings视图的short_desc列)组成,如果类型已转换为基本类型,则指示哪一个(方括号中的值)。
第二行用普罗米修斯表示值的类型。 第三行是带有一组标签和一个指定值的指标。


返回shared_buffers的值。


 # HELP pg_settings_shared_buffers_bytes Sets the number of shared memory buffers used by the server. [Units converted to bytes.] # TYPE pg_settings_shared_buffers_bytes gauge pg_settings_shared_buffers_bytes{server="127.0.0.1:5432"} 1.34217728e+08 

pg_settings_shared_buffers_bytes指标名称。 根据良好格式的规则,它由表的名称,度量的名称和度量单位组成。 接下来是pg_settings表的简短描述。 最后,指示度量标准值已转换为字节单位(单位转换为字节)。 为什么值得关注后者,因为直接在数据库中值看起来有些不同,即:


  name | setting | unit | short_desc ----------------+---------+------+-------------------------------------------------------------- shared_buffers | 16384 | 8kB | Sets the number of shared memory buffers used by the server. 

我们拥有的量度类型是GAUGE,这意味着它可以随时间取任意值。 在我们的情况下,进行微调时,缓冲区的数量可以在两个方向上改变。
您可以在Prometheus文档中了解有关指标类型及其差异的更多信息。


以下指标是wal_sender_timeout。 根据与上述相同的原理收集信息字段。 仅在这种情况下,度量标准值才转换为秒,并且数据库以毫秒为单位存储。 使用此功能时,在绘制图表时需要格外小心。


 # HELP pg_settings_wal_sender_timeout_seconds Sets the maximum time to wait for WAL replication. [Units converted to seconds.] # TYPE pg_settings_wal_sender_timeout_seconds gauge pg_settings_wal_sender_timeout_seconds{server="127.0.0.1:5432"} 60 

存储在数据库中的值:


 demo=# SELECT name, setting, COALESCE(unit, ''), short_desc, vartype FROM pg_settings WHERE name='wal_sender_timeout'; name | setting | coalesce | short_desc | vartype --------------------+---------+----------+----------------------------------------------------+--------- wal_sender_timeout | 60000 | ms | Sets the maximum time to wait for WAL replication. | integer 

所有具有单位的值都减少为两种类型:量度单位为字节; 时间指标以秒为单位。


自定义指标集


除了默认指标以外,您还可以使用自己的指标。 为此,只需通过参数--extend.query-path = query.yaml或通过环境变量PG_EXPORTER_EXTEND_QUERY_PATH设置带有用户查询的文件路径。
项目存储库具有一个带有示例的YAML文件: querys.yaml


我注意到,与以前的版本相比,在0.8.0中添加了新的密钥master和cache_seconds。 在下面的示例中,我们分析了记录格式和字段的用途。


query.yaml文件的样本内容


 pg_database: query: "SELECT pg_database.datname, pg_database_size(pg_database.datname) as size_bytes FROM pg_database" master: true cache_seconds: 30 metrics: - datname: usage: "LABEL" description: "Name of the database" - size_bytes: usage: "GAUGE" description: "Disk space used by the database" 

上例中的键和值:


  • pg_database请求返回的度量的任意前缀(必需);
  • query包含一个SQL查询(必需);
  • master仅在连接到URI时指定的数据库(主数据库)中执行请求。 使用标志--auto-discover-databases启动导出器时需要。 接受对或错。 默认为False。 (可选);
  • cache_seconds返回缓存数据的时间。 以秒为单位设置;
  • metrics -包含标签和指标的列表;
  • datnamesize_bytes列表项。 列表项的名称必须与查询中列的名称匹配;
  • usage -值的类型。 接受COUNTER,GAUGE,LABLE(更多信息请参见Prometheus文档)
  • description -自定义指标描述

示例返回指标:


 # HELP pg_database_size_bytes Disk space used by the database # TYPE pg_database_size_bytes gauge pg_database_size_bytes{datname="dbtest1",server="localhost:5432"} 1.0105503e+07 pg_database_size_bytes{datname="demo",server="localhost:5432"} 2.813719199e+09 pg_database_size_bytes{datname="postgres",server="localhost:5432"} 4.735491e+06 pg_database_size_bytes{datname="template0",server="localhost:5432"} 7.758339e+06 pg_database_size_bytes{datname="template1",server="localhost:5432"} 7.758339e+06 

总结


好吧,我们总结一下,最新版本的postgres_exporter 0.8.0中包含的所有内容。 基本上,所有改进都与监视多个实例和/或一个实例中的多个数据库有关。


  • exclude-databases参数(显示在0.6.0中)使您可以从要为其收集指标的数据库列表中排除数据库。 但是您不能排除URI连接中指定的数据库,因为它是主数据库。
  • 现在,您可以将自定义查询与auto-discover-databases参数一起用于全局视图(pg_stat_activity,pg_stat_database等)。 为此,添加了一个附加的master字段,指示仅应在master数据库中执行该请求;
  • 现在,您可以将默认指标与参数auto-discover-databases一起使用。
  • 对于用户请求,已添加cache_seconds字段,该字段使您可以设置服务器对相应请求的响应将被缓存的时间(以秒为单位)。

资料来源


  • Prometheus [ 1 ]是用于监视和警报事件的开源应用程序。 它将实时指标写入到使用HTTP请求模型构建的时间序列数据库中,并具有灵活的查询和实时警报。
  • postgres_exporter是Prometheus的PostgreSQL指标的导出器。
    撰写本文时,版本为0.5.1。 支持的PostgreSQL 9.4+版本(但实践证明,它适用于9.3)。

Source: https://habr.com/ru/post/zh-CN480902/


All Articles