热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PG监控小工具

PG监控

点击“蓝字”关注我们


PostgreSQL的监控方案目前使用比较多的有zabbix和prometheus,第三方提供了一些监控模板直接导入即可,也可以根据自己关注点自定义监控指标。但是这些监控安装和配置比较麻烦,本文介绍一款轻量级的监控小工具Sampler,Sampler是用于Shell命令执行,可视化和警报的监控工具。只需要配置一个简单的YAML文件即可。


安装


wget https://github.com/sqshq/sampler/releases/download/v1.1.0/sampler-1.1.0-linux-amd64 -O usr/local/bin/sampler 

chmod +x /usr/local/bin/sampler


配置YAML文件


下面是我配置了一个我关注的监控指标,需要的可以直接拷贝下面代码


    variables:
    PGPASSWORD: xxxxxx
    postgres_connection: psql -h localhost -U postgres -p 5432 -d test --no-align
    --tuples-only
    runcharts:
    - title: 数据库数据写(Byte)
    position: [[52, 6], [28, 11]]
    rate-ms: 1000
    legend:
    enabled: true
    details: false
    scale: 0
    items:
    - label: 后台写
    color: 178
    init: $postgres_connection
    sample: select bs.block_size * (buffers_checkpoint + buffers_clean + buffers_backend)
    as total_writen from pg_stat_bgwriter,(SELECT CAST(current_setting('block_size') AS INTEGER) AS block_size) AS bs;
    - label: 检查点平均写
    color: 162
    init: $postgres_connection
    sample: select buffers_checkpoint * bs.block_size / (checkpoints_timed + checkpoints_req)
    as checkpoint_write_avg from pg_stat_bgwriter,(SELECT CAST(current_setting('block_size') AS INTEGER) AS block_size) AS bs;
    - title: 数据库连接
    position: [[24, 6], [28, 11]]
    rate-ms: 1000
    legend:
    enabled: true
    details: false
    scale: 0
    items:
    - label: 数据库连接总数
    init: $postgres_connection
    sample: select count(*) from pg_stat_activity;
    - label: 活跃数据库连接
    init: $postgres_connection
    sample: select count(*) from pg_stat_activity where state = 'active' and pid
    <> pg_backend_pid();
    - label: 空闲数据库连接
    init: $postgres_connection
    sample: select count(*) from pg_stat_activity where state = 'idle' and pid
    <> pg_backend_pid();
    - label: 空闲未提交数据库连接
    init: $postgres_connection
    sample: select count(*) from pg_stat_activity where state = 'idle in transaction'
    and pid <> pg_backend_pid();
    - title: 数据库增删改
    position: [[0, 6], [24, 11]]
    rate-ms: 1000
    legend:
    enabled: true
    details: false
    scale: 0
    items:
    - label: 插入行数
    init: $postgres_connection
    sample: select tup_inserted from pg_stat_database where datname = current_database();
    - label: 删除行数
    init: $postgres_connection
    sample: select tup_deleted from pg_stat_database where datname = current_database();
    - label: 更新行数
    init: $postgres_connection
    sample: select tup_updated from pg_stat_database where datname = current_database();
    gauges:
    - title: 数据库缓存命中率
    position: [[39, 0], [21, 3]]
    rate-ms: 1000
    scale: 2
    color: 32
    percent-only: true
    cur:
    init: $postgres_connection
    sample: select round(sum(blks_hit)*100/sum(blks_hit+blks_read),2)::numeric
    from pg_stat_database where datname = current_database();
    max:
    sample: echo 100
    min:
    sample: echo 0
    - title: 表缓存命中率
    position: [[39, 3], [21, 3]]
    rate-ms: 1000
    scale: 2
    color: 160
    percent-only: true
    cur:
    init: $postgres_connection
    sample: SELECT SUM(heap_blks_hit)*100 / nullif(SUM(heap_blks_hit) + SUM(heap_blks_read),
    0) FROM pg_statio_user_tables;
    max:
    sample: echo 100
    min:
    sample: echo 0
    - title: 索引缓存命中率
    position: [[60, 3], [20, 3]]
    rate-ms: 1000
    scale: 2
    color: 178
    percent-only: true
    cur:
    init: $postgres_connection
    sample: SELECT (SUM(idx_blks_hit))*100 / nullif(SUM(idx_blks_hit + idx_blks_read),
    0) FROM pg_statio_user_indexes;
    max:
    sample: echo 100
    min:
    sample: echo 0
    - title: 数据库事务提交率
    position: [[60, 0], [20, 3]]
    rate-ms: 1000
    scale: 2
    color: 122
    percent-only: true
    cur:
    init: $postgres_connection
    sample: select round(100*(xact_commit::numeric/(case when xact_commit > 0
    then xact_commit else 1 end + xact_rollback)),2)::numeric as commit_ratio
    from pg_stat_database where datname = current_database();
    max:
    sample: echo 100
    min:
    sample: echo 0
    textboxes:
    - title: 服务器状态
    position: [[0, 0], [39, 6]]
    rate-ms: 500
    color: 200
    sample: top -bn 1 | head -n 5
    - title: 数据库会话 锁情况
    position: [[0, 29], [80, 12]]
    rate-ms: 1000
    color: 160
    sample: psql -h localhost -U postgres -p 5432 -d test -c "SELECT COUNT(pg_stat_activity.pid)
    AS number_of_queries,substring(TRIM(leading FROM regexp_replace(pg_stat_activity.query,
    '[\n\r]+'::text, ' '::text, 'g'::text)) FROM 0 FOR 80) AS query_name,MAX(age(current_timestamp,
    query_start)) AS max_wait_time,wait_event,usename,locktype,MODE,granted FROM
    pg_stat_activity LEFT JOIN pg_locks ON pg_stat_activity.pid = pg_locks.pid
    WHERE query != '' AND query NOT ilike '%pg_%' AND query NOT ilike '%application_name%'
    AND query NOT ilike '%inet%' AND age(current_timestamp, query_start) > '5
    milliseconds'::INTERVAL GROUP BY query_name,wait_event,usename,locktype,MODE,granted
    ORDER BY max_wait_time DESC;"
    - title: 数据库实例概况
    position: [[0, 17], [34, 12]]
    rate-ms: 1000
    color: 122
    init: $postgres_connection
    sample: select '数据库版本: ' opttype,substring(version(),'(.*) on ') union all
    select '数据库当前用户: ',current_role union all select '当前访问数据库: ',current_database()
    union all select '当前数据库大小: ',pg_size_pretty(pg_database_size(current_database()))
    union all select '当前数据库表数量:',count(*)::varchar from pg_tables where schemaname
    not in('pg_catalog','information_schema') union all select '实例端口: ',setting
    from pg_settings where name = 'port' union all select '实例初始化时间: ',to_timestamp(((system_identifier>>32)
    & (2^32 -1)::bigint))::varchar from pg_control_system() union all select '实例启动时间: ',pg_postmaster_start_time()::varchar
    union all select '实例数据目录: ',setting from pg_settings where name = 'data_directory'
    union all select '实例参数文件: ',setting from pg_settings where name = 'config_file'
    union all select '实例访问配置文件:',setting from pg_settings where name = 'hba_file';
    - title: 对象膨胀情况
    position: [[34, 17], [46, 12]]
    rate-ms: 1000
    color: 80
    sample: psql -h localhost -U postgres -p 5432 -d test -c "WITH constants AS (SELECT
    current_setting('block_size') ::NUMERIC AS bs, 23 AS hdr, 4 AS ma), bloat_info
    AS (SELECT ma, bs, schemaname, tablename, (datawidth + (hdr + ma - (CASE WHEN
    hdr%ma = 0 THEN ma ELSE hdr%ma END))) ::NUMERIC AS datahdr, (maxfracsum *
    (nullhdr + ma - (CASE WHEN nullhdr%ma = 0 THEN ma ELSE nullhdr%ma END))) AS
    nullhdr2 FROM (SELECT schemaname, tablename, hdr, ma, bs, SUM((1 - null_frac)
    * avg_width) AS datawidth, MAX(null_frac) AS maxfracsum, hdr + (SELECT 1 +
    COUNT(*) / 8 FROM pg_stats s2 WHERE null_frac <> 0 AND s2.schemaname = s.schemaname
    AND s2.tablename = s.tablename) AS nullhdr FROM pg_stats s, constants GROUP
    BY 1,2,3,4,5) AS foo), table_bloat AS (SELECT schemaname, tablename, cc.relpages,
    bs, ceil((cc.reltuples * ((datahdr + ma - (CASE WHEN datahdr%ma = 0 THEN ma
    ELSE datahdr%ma END)) + nullhdr2 + 4)) / (bs - 20 ::FLOAT)) AS otta FROM bloat_info
    JOIN pg_class cc ON cc.relname = bloat_info.tablename JOIN pg_namespace nn
    ON cc.relnamespace = nn.oid AND nn.nspname = bloat_info.schemaname AND nn.nspname
    <> 'information_schema'), index_bloat AS (SELECT schemaname, tablename, bs,
    coalesce(c2.relname, '?') AS iname, coalesce(c2.reltuples, 0) AS ituples,
    coalesce(c2.relpages, 0) AS ipages, coalesce(ceil((c2.reltuples * (datahdr
    - 12)) / (bs - 20 ::FLOAT)), 0) AS iotta FROM bloat_info JOIN pg_class cc
    ON cc.relname = bloat_info.tablename JOIN pg_namespace nn ON cc.relnamespace
    = nn.oid AND nn.nspname = bloat_info.schemaname AND nn.nspname <> 'information_schema'
    JOIN pg_index i ON indrelid = cc.oid JOIN pg_class c2 ON c2.oid = i.indexrelid)
    SELECT TYPE 对象类型, schemaname||'.'||object_name 对象名, bloat 膨胀率, pg_size_pretty(raw_waste)
    AS 膨胀量 FROM (SELECT 'table' AS TYPE, schemaname, tablename AS object_name,
    round(CASE WHEN otta = 0 THEN 0.0 ELSE table_bloat.relpages / otta ::NUMERIC
    END, 1) AS bloat, CASE WHEN relpages THEN '0' ELSE (bs * (table_bloat.relpages
    - otta) ::bigint) ::bigint END AS raw_waste FROM table_bloat UNION SELECT
    'index' AS TYPE, schemaname, tablename || '::' || iname AS object_name, round(CASE
    WHEN iotta = 0 OR ipages = 0 THEN 0.0 ELSE ipages / iotta ::NUMERIC END, 1)
    AS bloat, CASE WHEN ipages THEN '0' ELSE (bs * (ipages - iotta)) ::bigint
    END AS raw_waste FROM index_bloat) bloat_summary ORDER BY raw_waste DESC,
            bloat DESC LIMIT 10;"


    运行


    sampler -c config.yml


    监控效果


    推荐阅读

    Oracle 性能优化技巧-获取真实执行计划

    2020-01-06

    MySQL事物隔离级别以及脏读、幻读、不可重复读示例

    2020-01-05

    点击“阅读原文”



    推荐阅读
    • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
    • 本文介绍了在PostgreSQL中批量导入数据时的优化方法。包括使用unlogged表、删除重建索引、删除重建外键、禁用触发器、使用COPY方法、批量插入等。同时还提到了一些参数优化的注意事项,如设置effective_cache_size、shared_buffer等,并强调了在导入大量数据后使用analyze命令重新收集统计信息的重要性。 ... [详细]
    • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
    • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
    • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
    • Python SQLAlchemy库的使用方法详解
      本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
    • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
    • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
    • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
    • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
    • OpenMap教程4 – 图层概述
      本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
    • 流数据流和IO流的使用及应用
      本文介绍了流数据流和IO流的基本概念和用法,包括输入流、输出流、字节流、字符流、缓冲区等。同时还介绍了异常处理和常用的流类,如FileReader、FileWriter、FileInputStream、FileOutputStream、OutputStreamWriter、InputStreamReader、BufferedReader、BufferedWriter等。此外,还介绍了系统流和标准流的使用。 ... [详细]
    • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
    • web.py开发web 第八章 Formalchemy 服务端验证方法
      本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
    • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
    author-avatar
    youyiyang
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有