Nuevas características de monitoreo de Postgres_exporter PostgreSQL

Buenas tardes, habr lectores!


En la primera nota sobre posgres_exporter , examiné un caso bastante especial cuando trabajé con un fitcha nuevo en ese momento, a saber, la capacidad de monitorear un conjunto de instancias y / o bases de datos por un exportador. Y describió ese "ramo" de problemas que encontró y las soluciones que usó para hacerlo funcionar.
Y así, el 25 de noviembre, se lanzó la próxima versión postgres_exporter 0.8.0. Solucionó los problemas descritos en el artículo anterior y también, lo cual es especialmente agradable, agregó una nueva funcionalidad.


Pido un gato ...


Para empezar, me gustaría presentarle postgre_exporter con más detalle y escribir una especie de breve guía de inicio rápido. Repasemos los puntos principales:


  1. Variables de entorno y parámetros de inicio
  2. ¿Qué son las métricas predeterminadas?
  3. Cómo agregar tus propias métricas

Descripción


postgres_exporter : una utilidad para recopilar métricas de instancias de un clúster DBMS PostgreSQL en un formato Prometheus accesible, escrito en Go, es de código abierto y se distribuye de forma gratuita.


Variables de entorno y argumentos de línea de comando


Postgres_exporter, como tal, no tiene un archivo de configuración y todos los parámetros se pasan al exportador mediante variables de entorno o mediante argumentos de línea de comandos. Al mismo tiempo, los parámetros para conectarse al DBMS solo se pueden transferir a través de variables de entorno.


Variables de entorno


Como se mencionó anteriormente, las variables de entorno se pueden dividir en dos grupos. El primero pasa la cadena de conexión, el segundo duplica los argumentos de la línea de comando.


Comencemos con el primer grupo. Estas variables comienzan con el prefijo DATA_SOURCE_ :


  • DATA_SOURCE_NAME: se usa de forma predeterminada. Le permite grabar la cadena de conexión en el formato = , y en forma de URI y puede contener el inicio de sesión y la contraseña de la conexión.
    Opciones de trabajo válidas para conectarse a 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 (conexión a través de un socket UNIX, tomado de los directorios unix_socket_directorios de una instancia de PostgreSQL);
    • host=dbhost port=dbport dbname=database user=rolename sslmode=disable ;

    Si necesita conectarse a varias instancias (no se permite usar un espacio después del punto decimal):


    • 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: alternativo a DATA_SOURCE_NAME. Esta opción solo es adecuada si tiene la intención de conectarse a una sola instancia de PostgreSQL).
    La variable DATA_SOURCE_URI establece la parte del URI sin nombre de usuario y contraseña, en la forma "dbhost: dbport / dbname? Key = value". El nombre de usuario y la contraseña se toman de las variables de entorno DATA_SOURCE_USER y DATA_SOURCE_PASS, o de los archivos DATA_SOURCE_USER_FILE DATA_SOURCE_PASS_FILE.
    Cuando el nombre de usuario y la contraseña se almacenan en archivos, su contenido se extrae y se reasigna a las variables DATA_SOURCE_USER y DATA_SOURCE_PASS. Además, en el código, todo esto se recopila en un URI completo de la forma: "postgresql://" + DATA_SOURCE_USER + ":" + DATA_SOURCE_PASS + "@" + DATA_SOURCE_URI
  • DATA_SOURCE_URI_FILE: lo mismo que DATA_SOURCE_URI, solo se lee del archivo;
  • DATA_SOURCE_USER: cuando usa DATA_SOURCE_URI, establece el nombre de usuario para conectarse al DBMS;
  • DATA_SOURCE_USER_FILE: lo mismo que DATA_SOURCE_USER, solo se lee del archivo;
  • DATA_SOURCE_PASS: cuando usa DATA_SOURCE_URI, establece la contraseña de usuario para conectarse al DBMS;
  • DATA_SOURCE_PASS_FILE: lo mismo que DATA_SOURCE_PASS, solo se lee del archivo;

El segundo grupo incluye argumentos duplicados variables. Es decir al inicio, puede elegir, establecer los parámetros operativos de la aplicación en forma de variables de entorno o pasar como argumentos al inicio. Comience con el prefijo PG_EXPORTER_ :


  • PG_EXPORTER_WEB_LISTEN_ADDRESS: establece la dirección y el puerto a través del cual el exportador recibirá las solicitudes de Prometheus. Por defecto :9187 ;
  • PG_EXPORTER_WEB_TELEMETRY_PATH: la ruta a lo largo de la cual se proporcionan las métricas. Por defecto /metrics ;
  • PG_EXPORTER_DISABLE_DEFAULT_METRICS: deshabilita la recopilación de métricas de forma predeterminada. El hecho de que estas métricas estarán por debajo. Solo verdadero o falso acepta valores. Falso por defecto (se permite la recopilación de métricas);
  • PG_EXPORTER_DISABLE_SETTINGS_METRICS: deshabilita la recopilación de métricas de la vista pg_settings. El hecho de que estas métricas estarán por debajo. Solo verdadero o falso acepta valores. Falso por defecto (se permite la recopilación de métricas);
  • PG_EXPORTER_AUTO_DISCOVER_DATABASES: detecta todas las bases de datos de una instancia de clúster para recopilar sus métricas. Solo verdadero o falso acepta valores. De forma predeterminada, falso (las métricas se recopilan solo en la base de datos que se especificó en los parámetros de conexión);
  • PG_EXPORTER_EXCLUDE_DATABASES: excluye la base de datos de la lista de bases de datos para las que se recopilan métricas si PG_EXPORTER_AUTO_DISCOVER_DATABASES=true . Representa una lista separada por comas de nombres de bases de datos. El valor predeterminado es una cadena vacía. IMPORTANTE
    • plantillas template0 y template1: no es necesario excluirlas, por lo que se cortan en la etapa de obtener una lista de bases de datos de pg_databases;
    • no puede excluir la base de datos especificada en el URI.
  • PG_EXPORTER_EXTEND_QUERY_PATH: la ruta al archivo YAML que contiene consultas de los usuarios. El archivo queries.yaml contiene ejemplos;
  • PG_EXPORTER_CONSTANT_LABELS: etiqueta (constante) agregada a todas las métricas. Está escrito como una lista de pares = , separados por una coma.

Argumentos de línea de comando


  • web.listen-address es lo mismo que PG_EXPORTER_WEB_LISTEN_ADDRESS;
  • web.telemetry-path - lo mismo que PG_EXPORTER_WEB_TELEMETRY_PATH;
  • disable-default-metrics es lo mismo que PG_EXPORTER_DISABLE_DEFAULT_METRICS;
  • disable-settings-metrics es lo mismo que PG_EXPORTER_DISABLE_SETTINGS_METRICS;
  • auto-discover-database es lo mismo que PG_EXPORTER_AUTO_DISCOVER_DATABASES;
  • excluir-bases de datos es lo mismo que PG_EXPORTER_EXCLUDE_DATABASES;
  • extender.query-path: lo mismo que PG_EXPORTER_EXTEND_QUERY_PATH;
  • constantLabels: lo mismo que PG_EXPORTER_CONSTANT_LABELS;
  • dumpmaps: muestra el contenido interno del mapa de métricas. Se utiliza para depurar las solicitudes de los usuarios. No inicia la aplicación;
  • log.level: establece uno de los niveles de registro posibles: debug , info , warn , error , fatal ;
  • log.format: establece el método y el formato de la salida del registro. Por ejemplo: logger:syslog?appname=bob&local=7 o logger:stdout?json=true . Por defecto, logger:stderr .

Métricas predeterminadas


- métricas - son un cierto conjunto de métricas de monitoreo, cuya colección se establece directamente en el código. La colección - se puede deshabilitar especificando los parámetros de la línea de comando --disable-default-metrics y /disable-settings-metrics o definiendo las variables de entorno apropiadas.
Observo que en la versión actual, el problema del uso de métricas se resolvió cuando se habilitó la detección automática, debido a que hubo una duplicación de las métricas, lo que provocó errores.


De forma predeterminada, las métricas de las siguientes vistas se envían a la supervisión:


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

De lo que debe prestar atención son pg_stat_replication y pg_stat_activity, ya que el conjunto de campos devueltos depende de la versión de PostgreSQL. Para esto, la versión DBMS se verifica en el exportador y se selecciona la solicitud correspondiente. No puede especificar una versión en las consultas de los usuarios. Se supone que el administrador sabe de antemano qué versión se supervisará la instancia. También pueden surgir problemas si intenta recopilar métricas por un exportador de instancias de diferentes versiones.
Con las métricas de configuración de la instancia (pg_settings), todo es algo más simple, están formadas por la solicitud:


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

Por lo tanto, de forma predeterminada, un conjunto de métricas se forma solo a partir de valores numéricos.


Además, consideraremos la conclusión del exportador, incluida la forma en que entenderemos por qué las métricas codificadas tienen derecho a existir. Por ejemplo, tome dos métricas: shared_buffers y wal_sender_timeout. En la salida del exportador, para cada métrica obtenemos tres filas.
La primera línea representa una pista y consiste en el nombre de la métrica en postgres_exporter, una descripción (la columna short_desc de la vista pg_settings) y si el tipo se convirtió al tipo base, se indica cuál (el valor entre corchetes).
La segunda línea indica el tipo de valor, en términos de Prometeo. Y la tercera línea, una métrica con un conjunto de etiquetas y un valor asignado.


Valores devueltos para 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 : el nombre de la métrica. De acuerdo con las reglas de buena forma, se compone del nombre de la tabla, el nombre de la métrica y la unidad de medida. Luego viene una breve descripción de la tabla pg_settings. Y por último, una indicación de que el valor de la métrica se ha convertido a una unidad de bytes (Unidades convertidas a bytes). Por qué vale la pena prestar atención a esto último, porque directamente en la base de datos el valor se ve un poco diferente, a saber:


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

El tipo de métrica que tenemos es GAUGE, lo que significa que puede tomar valores arbitrarios con el tiempo. En nuestro caso, el número de buffers, cuando se ajusta, puede cambiar en ambas direcciones.
Puede obtener más información sobre los tipos de métricas y sus diferencias en la documentación de Prometheus.


La siguiente métrica es wal_sender_timeout. Los campos de información se recopilan de acuerdo con el mismo principio descrito anteriormente. Solo en este caso, el valor de la métrica se convierte a segundos y la base de datos se almacena en milisegundos. Con esta función, debe ser cuidadoso y tener en cuenta al trazar gráficos.


 # 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 

El valor almacenado en la base de datos:


 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 

Todos los valores que tienen unidades se reducen a dos tipos: métricas de volumen a bytes; métricas de tiempo a segundos.


Conjunto de métricas personalizadas


Además de o en lugar de las métricas predeterminadas, puede usar las suyas propias. Para hacer esto, simplemente configure la ruta del archivo, con consultas del usuario, a través del argumento --extend.query-path = query.yaml o mediante la variable de entorno PG_EXPORTER_EXTEND_QUERY_PATH.
El repositorio del proyecto tiene un archivo YAML con ejemplos: queries.yaml


Observo que en comparación con la versión anterior, en 0.8.0 se agregaron nuevas claves master y cache_seconds. En el siguiente ejemplo, analizamos el formato de grabación y el propósito de los campos.


Contenido de muestra del archivo queries.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" 

Claves y valores del ejemplo anterior:


  • pg_database : un prefijo arbitrario para las métricas devueltas por la solicitud (obligatorio);
  • query : contiene una consulta SQL (obligatorio);
  • master : ejecute la solicitud solo en la base de datos especificada cuando se conecte al URI (base de datos maestra). Se requiere al iniciar el exportador con el indicador --auto-discover-database. Acepta verdadero o falso. Falso por defecto. (Opcional);
  • cache_seconds : tiempo durante el cual se devolverán los datos de caché. Se establece en segundos;
  • metrics : contiene una lista de etiquetas y métricas;
  • datname , size_bytes : elemento de la lista. El nombre del elemento de la lista debe coincidir con el nombre de la columna en la consulta;
  • usage - tipo de valor. Acepta COUNTER, GAUGE, LABLE (más en la documentación de Prometheus)
  • description : descripción métrica personalizada

Ejemplo de métricas de retorno:


 # 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 

Resumen


Bueno, resumimos todo lo que tenemos en la última versión de postgres_exporter 0.8.0. Básicamente, todas las mejoras se relacionan con el monitoreo de varias instancias y / o varias bases de datos en una instancia.


  • El argumento de exclusión de bases de datos (aparecido en 0.6.0) le permite excluir bases de datos de la lista de bases de datos para las que se recopilarán métricas. Pero no puede excluir la base de datos que se especifica en la conexión URI, ya que es una base maestra;
  • Ahora puede usar consultas personalizadas para vistas globales (pg_stat_activity, pg_stat_database, etc.) junto con el argumento de auto-descubrimiento-bases de datos. Para hacer esto, se agregó un campo maestro adicional, que indica que la solicitud debe ejecutarse solo en la base de datos maestra;
  • Ahora puede usar las métricas predeterminadas con el argumento auto-discover-database;
  • Para las solicitudes de los usuarios, se ha agregado el campo cache_seconds, que le permite establecer el tiempo (en segundos) en el que se almacenará en caché la respuesta del servidor a la solicitud correspondiente.

Fuentes


  • Prometheus [ 1 ] es una aplicación de código abierto utilizada para monitorear y alertar eventos. Escribe métricas en tiempo real en una base de datos de series de tiempo construida utilizando el modelo de solicitud HTTP, con consultas flexibles y alertas en tiempo real.
  • postgres_exporter es un exportador de métricas PostgreSQL para Prometheus.
    Versión, al momento de escribir, v 0.5.1. Versiones compatibles de PostgreSQL 9.4+ (pero como la práctica ha demostrado, funciona en 9.3).

Source: https://habr.com/ru/post/480902/


All Articles