pgwatch2, PostgreSQL指标监视器/仪表板

分享于 

24分钟阅读

GitHub

  繁體
PostgreSQL metrics monitor/dashboard
  • 源代码名称:pgwatch2
  • 源代码网址:http://www.github.com/cybertec-postgresql/pgwatch2
  • pgwatch2源代码文档
  • pgwatch2源代码下载
  • Git URL:
    git://www.github.com/cybertec-postgresql/pgwatch2.git
    Git Clone代码到本地:
    git clone http://www.github.com/cybertec-postgresql/pgwatch2
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/cybertec-postgresql/pgwatch2
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    pgwatch2

    灵活自包含的PostgreSQL度量监视/dashboarding解决方案

    安装

    软件打包为 Docker (。对于自定义设置,请参阅下面的最后一段),以便快速启动。

    
    # fetch and run the latest Docker image, exposing Grafana on port 3000 and administrative web UI on 8080
    
    
    docker run -d -p 3000:3000 -p 8080:8080 --name pw2 cybertec/pgwatch2
    
    
    
    

    几分钟之后,你可以打开 "数据库概述"面板并开始查看指标。 为了定义你自己的仪表板,你需要以管理员( 管理/pgwatch2admin )的身份登录。 注意:如果不希望添加"测试"数据库(。pgwatch2配置数据库),则在启动图像时设置NOTESTDB=1环境环境参数。

    对于没有容器管理框架的生产设置,强烈建议"。--restart除非已经停止"( 或者自定义启动脚本)。 然后推荐使用卷,以便更轻松地更新更新的pgwatch2 Docker 映像,而不通过自述文件的备份/还原过程。 但是,为了获得最大的灵活性,安全和更新简单,最好做定制设置- 请参见第2 段中的第2 段。

    
    for v in pg influx grafana pw2 ; do docker volume create $v ; done
    
    
    docker run --name pw2 -v pg:/var/lib/postgresql -v influx:/var/lib/influxdb -v grafana:/var/lib/grafana -v pw2:/pgwatch2/persistent-config -p 8080:8080 -p 3000:3000 cybertec/pgwatch2
    
    
    
    

    对于更高级的usecases ( 生产设置备份) 或者更容易的problemsolving,你可以决定公开所有服务

    
    # run with all ports exposed
    
    
    docker run -d -p 3000:3000 -p 5432:5432 -p 8086:8086 -p 8080:8080 -p 8088:8088 --name pw2 cybertec/pgwatch2
    
    
    
    

    注意:对于生产使用,确保你还明确指定了 listening ( -p ip: host_port: container_port ),默认情况下 Docker 使用 0.0.0.0 ( 所有网络设备)。

    对于自定义选项,更安全或者特定组件版本,可以轻松构建映像本身,只需 Docker:

     
    docker build. 
    
    
    
     

    有关所有受支持的Docker 环境变量的完整列表,请参见 ENV_VARIABLES.md

    特性
    • 通过纯SQL定义度量( 因此它们也可以来自业务域),易于扩展
    • 非侵入性设置,不需要扩展,也不需要超级用户权限
    • 度量/间隔的全局或者数据库级别配置
    • 使用 Grafana dashboarding引擎进行直观的度量。 提供的dasboards集
    • Grafana提供的可选警报( 电子邮件, Slack ,PagerDuty )
    • 支持PgBouncer和 AWS RDS图形/警报,除了PostgreSQL之外
    • kubernetes/openshift就绪
    项目背景

    有关项目动机和设计目标的更多背景信息,请参见原始系列blogposts宣布项目:

    限制/性能期望
    • 最小 512 MB RAM
    • Docker 默认磁盘大小 10 GB应该足够监控 5主机( 3 月默认度量保留策略,可以配置)
    • 低规格( 1个 vCPU,2 GB RAM ) 云机可以在"穷举"设置中轻松监控 100个 DBs ( 例如。 几乎所有的指标都是用 60s 秒来监控的,而不会破坏汗( <20%负载)
    • 在预设"穷举"设置中设置一个监视数据库,每个月需要 ~250 MB的InfluxDB磁盘存储。 根据对象的数量,表,索引,惟一sql的数量。
    • 一个 InfluxDB node 应该处理每秒的数千个请求,但是如果这不足以使用 Having/镜像 InfluxDB。 如果需要多于两个( 比如。 提供许多Grafana实例或者一些定制导出) 人们应该查看企业( 在prem或者云上) 或者 Graphite ( 它也支持作为度量存储后端)。
    安全/安全方面

    可以为大多数组件配置设置,但默认情况下,Docker 图像不关注安全性,而是快速使用。

    • 任何时候只有一个查询在监视的主机上运行,5s 语句超时( 可以配置) 不需要重影响。 对于一些度量,可能会发生度量读查询( 明显地"stat_statements") 需要一些毫秒,这可以能超过平均应用程序查询。
    • 从v1.3.0开始,有一个非根 Docker 版本( 适用于 OpenShift )
    • 默认情况下,管理网络用户界面不具有任何安全性。 通过环境变量进行配置。变量。
    • 默认情况下查看Grafana仪表板不需要登录。 编辑需要密码。通过环境可以配置。 变量。
    • 在 Docker 设置中InfluxDB没有认证,所以当 Having 关注时,就不应该暴露端口。
    • 基于"pg_stat_statements"( Stat语句概述/top )的指示板公开实际查询。 但是,如果没有任何风险可以被取消,那么( 或者至少根据面板) 应该被删除。
    电子邮件通知

    警告:Grafana提供的( point-and-click样式) 非常方便- 请参见这里的文档。 支持所有最流行的notification services。

    如果需要更复杂的场景/检查条件,则可以轻松集成TICK和 Kapacitor integrated见这里了解更多细节。

    组件
    • 使用Go编写的pgwatch2度量收集守护进程
    • 用于保存要收集的数据库和指标的配置的PostgreSQL数据库
    • 基于 InfluxDB的存储度量时间序列数据库
    • 用于 dashboarding ( point-and-click,一组预定义指示板的Grafana )
    • 用于管理监视的DBs和指标以及显示一些自定义度量概述的网络界面

    注意,你可以使用 Postgres,Grafana或者 InfluxDB,并只使用指标收集器和配置网页UI来运行pgwatch2映像。 这些外部安装必须可以从 Docker 中访问,尽管。 有关安装时没有 Docker的信息请参阅自述文件。

    默认 Docker 设置的组件图

    Component diagram

    使用现有的Postgres数据库

    创建一个新的pgwatch2数据库,preferrably也有一个拥有它的accroding角色。 然后在运行映像时推出架构 (pgwatch2/sql/datastore_setup/config_store.sql) 并设置以下参数: PW2_PGHOST,PW2_PGPORT,PW2_PGDATABASE,PW2_PGUSER,PW2_PGPASSWORD,PW2_PGSSL ( 可选)。

    使用现有的Grafana安装

    如果需要( 人们可以完全定义自己的),请从 grafana_dashboard 文件夹加载pgwatch2仪表板,并设置以下名称: PW2_GRAFANA_BASEURL。这里参数仅提供与 Web UI中的Grafana仪表板的正确链接。 Grafana是pgwatch2最松散耦合的组件,基本上根本不需要使用。 你可以直接在Influx的( 或者 Graphite ) api上使用收集到的度量。

    使用现有的InfluxDB安装

    设置以下环境变量: PW2_IHOST,PW2_IPORT,PW2_IDATABASE,PW2_IUSER,PW2_IPASSWORD,PW2_ISSL ( 可选)

    使用现有的Graphite 安装

    还可以将度量存储在 Graphite 中而不是 InfluxDB (。没有针对 Graphite的预定义pgwatch2仪表板) 中。 随后需要设置以下参数: PW2_DATASTORE=graphite,PW2_GRAPHITEHOST,PW2_GRAPHITEPORT

    用法
    • 在默认情况下,在 Docker 中运行的"pgwatch2"配置数据库被监视,以便你可以立即查看一些图表,但是你应该在 127.0.0.1 上打开"管理界面":8080/dbs或者登录到配置数据库并插入"pgwatch2.monitored_db"表(。DB - pgwatch2,默认用户/pw - pgwatch2/pgwatch2admin )。 注意,在你看到新插入的数据库的任何度量之前,可能需要 2min。
    • 你可以在以"管理员"( admin/pgwatch2admin ) 身份登录后创建新的Grafana仪表板( 并更改设置,创建用户,警报。)
    • 要收集的度量( 它们的间隔) 可以通过使用"最小限度"。"基本"或者"穷举"( monitored_db。preset_config表) 或者自定义JSON配置来自定义。
    • 要向添加一个新的度量( 简单SQL查询 returing point-in-time值) 头部到 http://127.0.0.1: 8080/公制。 查询应始终包含"epoch_ns"列,而"标记_"前缀可以用于应在InfluxDB中标记为( 因此索引)的列。
    • 还可以从"文稿"仪表板中看到可用指标列表以及一些指令
    • 一些预定义的( cpu_load,stat_statements ) 需要安装 helper 函数( 查看"pgwatch2/sql"文件夹)
    • 对于有效的图形,你希望熟悉基本的InfluxQL和 non_negative_derivative() 函数,因为Postgres统计信息大部分是evergrowing计数器。 这里是文档
    • 对于故障排除,可以在 http://127.0.0.1 :8080/logs/[pgwatch2|postgres|webui|influxdb|grafana] 或者在/var/logs/supervisor/下登录到 Docker 容器来查看这些组件的日志。
    配置用于监视的数据库的步骤
    • 作为基本要求,你需要登录用户( 非超级用户建议) 来连接你的服务器并获取度量查询
    
    create role pgwatch2 with login password 'secret';
    
    
    
    
    • 定义 helper 函数以使用上面定义的pgwatch2 登录来监视会话,如果使用超级用户登录( 不推荐),请确保检查 Is superuser? 复选框。
    
    psql -h mydb.com -U superuser -f pgwatch2/sql/metric_fetching_helpers/stat_activity_wrapper.sql mydb
    
    
    
    
    • 另外,("stat语句"仪表板和CPU负载) 还建议安装pg_stat_statement扩展( Postgres 9.4 + 需要对pgwatch2有用) 和 pl/python 语言。 后者通常被DB-as-a-service提供商禁用,因为安全原因。 为了最大限度地提高pg_stat_statement对IO时间的查询,我们还应该启用 track_io_timing
    
    # add pg_stat_statements to your postgresql.conf and restart the server
    
    
    shared_preload_libraries = 'pg_stat_statements'
    
    
    
    

    重启服务器后,将扩展安装为超级用户

    
    CREATE EXTENSION pg_stat_statements;
    
    
    CREATE EXTENSION plpythonu;
    
    
    
    

    现在还安装包装函数( 在超级用户角色下),用于启用非超级用户的"stat语句"和CPU负载信息获取

    
    psql -h mydb.com -U superuser -f pgwatch2/sql/metric_fetching_helpers/stat_statements_wrapper.sql mydb
    
    
    psql -h mydb.com -U superuser -f pgwatch2/sql/metric_fetching_helpers/cpu_load_plpythonu.sql mydb
    
    
    
    
    "数据库概述"仪表板屏幕截图

    "DB overview" dashboard

    这里有更多的屏幕截图。

    技术细节
    • 动态管理监视数据库,度量和间隔- 无需重新启动/重新部署
    • 安全
      • 只允许每个受监视数据库一个并发查询,因此副作用shoud最小
      • 可以配置语句超时
      • SSL连接支持安全over-the-internet监视( 用户"-e PW2_WEBSSL=1 -e PW2_GRAFANASSL=1 ( 启动 Docker 时)
      • Web UI和Grafana的可选认证( 默认可以自由访问)
    • 为获取整个设置的快照而提供的备份脚本( take_backup.sh )。 为了使( 在容器外运行) 更容易,至少应该将端口 5432 ( Postgres ) 和 8088 (。InfluxDB备份协议) 暴露在环回地址中。

    由 Docker 映像公开的端口:

    • 5432 - Postgres配置数据库
    • 8080 - 管理网络用户界面( 监视的主机,度量,度量配置)
    • 3000 - Grafana dashboarding
    • 8086 - InfluxDB API
    • 8088 - InfluxDB备份端口
    管理网络用户界面

    为了便于配置更改(。将数据库添加到监视,添加度量),有一个小型 python Web应用程序绑定了( 在 Docker 端口 8080上公开),使用了of框架。 对于批量更改,技术上也可以登录配置数据库,并直接在"pgwatch2"模式中更改表。 除了管理度量收集配置之外,Web UI另外两个有用的功能是查看单个组件的日志,该日志将查看单个组件的日志,使它的在时间周期最长的运行时查找。

    默认情况下,网络用户界面可以自由访问。 如果需要一些安全性,那么下面的环境。 变量可以用于强制写权限- PW2_WEBNOANONYMOUS。PW2_WEBUSER。PW2_WEBPASSWORD。

    默认情况下,组件日志( Postgres,Influx,Grafana,go守护进程,网络用户界面本身) 通过"/logs"端点公开。 如果不需要设置PW2_WEBNOCOMPONENTLOGS环境,请。 变量。

    添加度量

    度量定义- 指定的SQL查询可以返回很多有用的查询,它们可以有不同的查询文本版本。 通过定期连接目标数据库并检查版本,将自动选择度量定义的正确版本。 定义度量定义时,你应该遵循以下几个基本概念:

    • 每个度量查询应该有一个"epoch_ns"( 自纪元以来,默认InfluxDB时间戳精度) 列,以记录读取时间。 如果列不存在,尽管使用服务器的收集时间戳将会失去一些精确的精度( 假设内部数据中心监视)。
    • 查询只能返回文本。整数。布尔值或者浮点数( a。k。 双精度) 数据。
    • 列可以通过使用"标记_"前缀来选择"加标签"。 这样,InfluxDB将根据以下优点对列数据进行索引:
      • 高级自动发现支持索引键/值,在使用Grafana构建图表时。
      • 更快的InfluxDB查询查询这些列。
      • 用于重复值的磁盘空间较少。 因这里,当你返回一些长时间和重复的状态字符串( 可以使用Singlestat或者表格面板) 时,可以能需要使用"标记_"对列进行前缀。
    更新到较新的Docker 版本

    pgwatch2代码部分不需要太多维护本身,但是pgwatch2依赖( Grafana,InfluxDB )的主要组件是相当活跃的,因此在我们也会尝试更新新的'最新'映像,因此在 Docker-Hub 语句上检查更新时间是有意义,。 你也可以随时选择构建自己的图像,构建脚本将下载最新的组件。

    如果可能的话,获取最新的映像最简单的方法就是停止旧的映像,并按照自述文件开头的描述再次进行'Docker 拉/运行'。

    如果使用定制设置,那么切换单个组件应该非常简单,只需遵循组件提供程序
    指令。从当前 Docker 容器迁移数据到另一个更新的pgwatch2 Docker 映像版本,目前需要相当多的步骤。 请参见这里的take_backup.sh 脚本 ,了解更多细节。 要使更新更简单,最好是先考虑它,然后使用 Docker 卷- 有关详细信息,请参阅 Dockerfile。 某些情况下更新到更新的pgwatch2 Web UI或者gahterer守护进程可能仍然需要从"迁移"子文件夹中加载一些手动配置数据库模式脚本- 错误消息将包含"缺少列"或者"错误数据类型"。

    基本上有两个选项- 首先,进入 Docker 容器( 比如。 执行以下命令,并安装最新的Grafana. deb 包并将它的安装到 Docker。 这其实是最简单的方法。 另一种方法是获取最新的pgwatch2映像,它已经使用了最新版本的组件,使用"Docker 拉",然后从旧设置的备份中恢复数据( InfluxDB + Postgres )。 要还原一个需要再次进入 Docker 容器,但是按照 take_backup.sh 中描述的步骤不应该是真正的问题。

    提示:为了使恢复过程更加简单,在新容器中使用"-v ~/pgwatch2_backups:/pgwatch2_backups:rw,z" 启动 Docker 映像时,将主机文件夹装载到新容器中已经有意义了。 否则,需要设置SSH或者使用类似S3之类的东西。 另外请注意,需要公开端口 5432和 8088以在 Docker 之外进行备份。

    没有 Docker 安装

    所有假设Ubuntu的例子。

    安装Postgres并为 pgwatch2/grafana创建数据库/角色

    
    sudo apt install postgresql
    
    
    
    

    默认端口:5432

    1.1.创建一个用户和一个数据库来保存Grafana配置

    
    psql -c"create user pgwatch2_grafana password 'xyz'"
    
    
    psql -c"create database pgwatch2_grafana owner pgwatch2_grafana"
    
    
    
    

    1.2.创建一个用户和一个数据库来保存pgwatch2配置

    
    psql -c"create user pgwatch2 password 'xyz'"
    
    
    psql -c"create database pgwatch2 owner pgwatch2"
    
    
    
    

    1.3 推出pgwatch2模式( 将保存数据库s的连接字符串,以便监视+ 度量定义)

    
    psql -f pgwatch2/sql/datastore_setup/config_store.sql pgwatch2
    
    
    psql -f pgwatch2/sql/datastore_setup/metric_definitions.sql pgwatch2
    
    
    
    

    安装 InfluxDB

    
    INFLUX_LATEST=$(curl -so- https://api.github.com/repos/influxdata/influxdb/tags | grep -Eo '"v[0-9.]+"' | grep -Eo '[0-9.]+' | sort -nr | head -1)
    
    
    wget https://dl.influxdata.com/influxdb/releases/influxdb_${INFLUX_LATEST}_amd64.deb
    
    
    sudo dpkg -i influxdb_${INFLUX_LATEST}_amd64.deb
    
    
    
    

    在/etc/influxdb/influxdb.conf 上查看/编辑入口配置,建议创建一个单独的限制登录用户 比如"pgwatch2"来存储度量。 请参见这里的在这里配置InfluxDB和创建新用户。

    API的默认端口: 8086

    安装 Grafana

    
    GRAFANA_LATEST=$(curl -so- https://api.github.com/repos/grafana/grafana/tags | grep -Eo '"v[0-9.]+"' | grep -Eo '[0-9.]+' | sort -nr | head -1)
    
    
    wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_${GRAFANA_LATEST}_amd64.deb
    
    
    sudo dpkg -i grafana_${GRAFANA_LATEST}_amd64.deb
    
    
    
    

    默认端口:3000

    2.1 配置Grafana配置以使用我们的pgwatch2_grafana数据库

    在/etc/grafana/grafana. ini的"[database]"部分放置如下内容

    
    [database]
    
    
    type = postgres
    
    
    host = my-postgres-db:5432
    
    
    name = pgwatch2_grafana
    
    
    user = pgwatch2_grafana
    
    
    password = xyz
    
    
    
    

    看一下 [server],[security] 和 [auth*] 部分也是推荐的。

    2.2.将Influx数据源设置为默认值

    使用Grafana用户界面( 管理-> 数据源) 或者调整并执行"pgwatch2/bootstrap/grafana_datasource.sql"

    2.3。向Grafana添加pgwatch2预定义的仪表板

    通过在"grafana_dashboards"文件夹中手动导入 json,或者在前面的步骤中已经执行了" grafana_datasource.sql"部分,需要对部分进行注释,从而完成这一操作。

    安装 python 3并启动 Web UI

    NB 网页界面不是必需的,但是让生活变得更加容易。 从技术上来说,在"pgwatch2.monitored_db"表中管理被监视数据库的连接字符串并在"pgwatch2.公制"表中添加/调整度量并在"pgwatch2.preset_config"表中添加"预设设定"也是不错的。

    
    # first we need Python 3 and"pip" - the Python package manager
    
    
    sudo apt install python3 python3-pip
    
    
    sudo pip3 install -U -r webpy/requirements.txt 
    
    
    
    

    4.1.启动网页用户界面

    
    cd webpy
    
    
    python3 web.py
    
    
    
    

    网络用户界面的默认端口: 8080

    4.2.配置从"/dbs"页面监视的数据库

    为了获得最大的度量,需要在监控数据库中使用一些包装/扩展。 有关安装信息,请参阅 section Steps配置数据库以监视

    安装并编译收集器

    检查 https://golang.org/dl/的最新版本。

    
    # install Go
    
    
    wget https://storage.googleapis.com/golang/go1.9.2.linux-amd64.tar.gz
    
    
    tar -C/usr/local -xzf go1.9.2.linux-amd64.tar.gz
    
    
    export PATH=$PATH:/usr/local/go/bin
    
    
    
    # compile the gatherer daemon
    
    
    cd pgwatch2
    
    
    ./build_gatherer.sh
    
    
    # an executable named"pgwatch2" should be generated.. .
    
    
    
    

    5.1.运行收集器

    
    ./pgwatch2 --host=my-postgres-db --user=pgwatch2 --password=xyz 
    
    
     --ihost=my-influx-db --iuser=pgwatch2 --ipassword=xyz
    
    
    
    # for all starting options run"./pgwatch2 --help"
    
    
    
    

    恭喜现在的度量应该开始流动,一些分钟后,一定已经看到了Grafana的一些图表。

    确保在系统重启时将自动启动一些"初始化脚本",以便pgwatch2守护进程和 Web UI自动启动。 对于外部封装的组件( Grafana,Influx,Postgres ),应该是这样的。