发布从sql查询生成的prometheus度量(也用于carto sql api)。
query-exporter-carto的Python项目详细描述
query-exporter是一个Prometheus导出器,它允许收集度量 从数据库查询,在指定的时间间隔。
它使用SQLAlchemy连接到不同的数据库引擎,包括 PostgreSQL、MySQL、Oracle和Microsoft SQL Server。
每个查询可以在多个数据库上运行,并更新多个度量。
使用如下所示的配置文件调用应用程序:
databases:db1:dsn:sqlite://db2:dsn:sqlite://metrics:metric1:type:gaugedescription:A sample gaugemetric2:type:summarydescription:A sample summarymetric3:type:histogramdescription:A sample histogrambuckets:[10,20,50,100,1000]metric4:type:enumdescription:A sample enumstates:[foo,bar,baz]queries:query1:interval:5databases:[db1]metrics:[metric1]sql:SELECT random() / 1000000000000000query2:interval:20databases:[db1,db2]metrics:[metric2,metric3]sql:|SELECT abs(random() / 1000000000000000),abs(random() / 10000000000000000)query3:interval:10databases:[db2]metrics:[metric4]sql:|SELECT value FROM (SELECT 'foo' AS value UNIONSELECT 'bar'UNION SELECT 'baz')ORDER BY random()LIMIT 1
dsn连接字符串的格式如下:
dialect[+driver]://[username:password][@host:port]/database
(有关可用选项的详细信息,请参见SQLAlchemy documentation)。
查询配置中的metrics列表必须与 在sql中定义的查询。
如果未指定后缀,interval值将被解释为秒; 有效后缀是s,m,h,d。只有整数值可以是 明确规定。如果未指定值(或指定为null),则查询为 在每个http请求时执行。
查询通常返回一行,但支持多行,并且 每一行都将导致相关度量的更新。这与任何 一种度量单位,但仪表除外,它将有效地更新为该值 从最后一排。
对于上面的配置,导出的度量如下:
# HELP metric1 A sample gauge # TYPE metric1 gauge metric1{database="db1"} 1549.0 # HELP metric2 A sample summary # TYPE metric2 summary metric2_count{database="db2"} 1.0 metric2_sum{database="db2"} 5229.0 metric2_count{database="db1"} 1.0 metric2_sum{database="db1"} 4513.0 # TYPE metric2_created gauge metric2_created{database="db2"} 1.5456472955657206e+09 metric2_created{database="db1"} 1.5456472955663064e+09 # HELP metric3 A sample histogram # TYPE metric3 histogram metric3_bucket{database="db2",le="10.0"} 0.0 metric3_bucket{database="db2",le="20.0"} 0.0 metric3_bucket{database="db2",le="50.0"} 0.0 metric3_bucket{database="db2",le="100.0"} 0.0 metric3_bucket{database="db2",le="1000.0"} 1.0 metric3_bucket{database="db2",le="+Inf"} 1.0 metric3_count{database="db2"} 1.0 metric3_sum{database="db2"} 714.0 metric3_bucket{database="db1",le="10.0"} 0.0 metric3_bucket{database="db1",le="20.0"} 0.0 metric3_bucket{database="db1",le="50.0"} 0.0 metric3_bucket{database="db1",le="100.0"} 0.0 metric3_bucket{database="db1",le="1000.0"} 1.0 metric3_bucket{database="db1",le="+Inf"} 1.0 metric3_count{database="db1"} 1.0 metric3_sum{database="db1"} 602.0 # TYPE metric3_created gauge metric3_created{database="db2"} 1.545647295565831e+09 metric3_created{database="db1"} 1.5456472955663848e+09 # HELP metric4 A sample enum # TYPE metric4 gauge metric4{database="db2",metric4="foo"} 0.0 metric4{database="db2",metric4="bar"} 1.0 metric4{database="db2",metric4="baz"} 0.0
度量将自动标记为database标签,以便 为每个数据库生成独立序列。
数据库引擎
sqlalchemy不依赖于 安装。这意味着可能需要为 使用中的发动机,如下所示:
pip install SQLAlchemy[postgresql] SQLAlchemy[mysql] ...
基于哪个数据库正在使用。
有关详细信息,请参见supported databases。
纸箱扩展
您可以定义carto连接,而不是sql dsn。如果要这样做,请在数据库中使用carto:条目。
示例:
databases: test_carto: carto: user: my_carto_user api_key: my_carto_api_key metrics: observations_simple_count: type: gauge description: Simple count to check if this works... queries: query_count_simple_count: interval: 120s databases: [test_carto] metrics: [observations_simple_count] sql: SELECT count(*) from county_population;
- 您不能在同一个数据库中同时使用dsn和carto条目,因为这样做毫无意义。
- 配置对象的可用字段与经度cartodatasource对象的可用字段相同。
- 到今天为止,这些字段是(请记住,有些字段可能不适合监视):
- api_version:v2默认情况下
- uses_batch:False默认情况下
- on_premise_domain:''默认。如果提供,carto url将使用它。如果不是,默认用户url将是。
- api_key:''默认。强制性的。建议使用主API密钥。
- user:''默认。强制性的。卡通用户(非电子邮件)
- cache:默认为空。缓存配置。在这种情况下暂时没有用。
开发环境
安装所需依赖项的最简单方法是创建虚拟环境并安装软件包:
python setup.py install pipenv install -e .