十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

使用OpenTelemetry监控达梦数据库

使用OpenTelemetry监控达梦数据库 概述最近我写了一篇通过OJR(OpenTelemetry Receiver by Java)使用OpenTelemetry和Prometheus监控IBM MQ的文章这是中文文章的地址。我们也曾经做过一个监控国产达梦数据库的工作。我现在也整理了一篇文章。达梦数据库已经有一些Prometheus的监控方案我们为什么还要提供一个OpenTelemetry的方案呢其中一个原因是OpenTelemetry是目前最重要的可观测性的行业标准有无数后端系统的支持(有些是开源系统有些是商业系统)。OpenTelemetry不仅仅支持metrics还支持traces和logs最近还要加入对Profiling data的支持等。Prometheus可以作为支持OpenTelemetry metrics的重要后端系统之一。再有一个原因就是Prometheus处理不了高基数(high cardinality)的metrics。就是说某个metric的label的取值太多的话是不行的。但是某些OpenTelemetry的metrics后端支持高基数比如Clickhouse。所以我们可以混用PrometheusClickhouse。这篇文档用到了一个简单有效的叫做OJR(OpenTelemetry Receiver by Java)的工具这个工具虽然只是简单封装了OpenTelemetry的Java SDK但确实可以大大地简化实现OpenTelemetry的逻辑并给最终用户提供很多直接可用的Agent。OJR虽然提供了对各种OpenTelemetry signals (Traces, Metrics, Logs)的支持但是目前主要实现的Agent还基本都是Metrics相关的。OJR提供了一个便捷输出OpenTelemetry Metrics的方式(不必再通过OpenTelemetry Collector转换)。如果要使用OJR提供的达梦数据库Agent需要安装Java 8或者更新的版本。OJR Agent相当于一个OpenTelemetry的Receiver加上一个OTLP exporter可以获取数据并发送给大量支持OpenTelemetry协议的后端应用和系统比如OpenTelemetry Collector。目前OJR提供的达梦数据库Agent只支持metrics。安装配置下面是所有演示程序的整体架构图用户可以只用其中一部分甚至可以把相关应用都放到一台主机上。下面简单地介绍一下通过OJR来使达梦数据库支持OpenTelemetry的步骤首先要下载OJR的Dameng DB Agent。比如使用下面的命令下载OJR release v0.6.3提供的Dameng DB Agentwget https://github.com/liurui-software/ojr/releases/download/v0.6.3/ojr-dameng-db-0.5.3.tar使用下面的命令展开Agenttar vxf ojr-dameng-db-0.5.3.tarcd ojr-dameng-db-0.5.3下一步就是配置达梦数据库的连接。假如我们只监控一个达梦数据库这个数据库的主机是在“192.168.3.14”端口是5236。下面是配置文件config/config.yaml的示例#Database properties:db.system: damengdb.driver: dm.jdbc.driver.DmDriverinstances:- db.address: 192.168.3.14db.port: 5236db.username: SYSDBAdb.password: TXlQYXNzd29yZAdb.connection.url: jdbc:dm://192.168.3.14:5236db.name: myDB1#OTel properties:otel.poll.interval: 25otel.callback.interval: 30#otel.backend.url: http://localhost:4317otel.backend.url: http://localhost:4318otel.transport: prometheushttpprometheus.port: 16540prometheus.restricted.metrics: db.sql.elapsed_time,db.lock.timeotel.service.name: DamengA以下是参数的说明db.system: dameng- 一个逻辑的数据库类型的名称仅仅是个标记db.driver: dm.jdbc.driver.DmDriver- JDBC的驱动instances:- 支持多个达梦数据库的连接db.address: 192.168.3.14- 达梦数据库远程地址db.port: 5236- 达梦数据库的端口号db.username: SYSDBA- 达梦数据库的用户名db.password: TXlQYXNzd29yZA- 达梦数据库的口令(用base64编码后的结果)db.connection.url: jdbc:dm://192.168.3.14:5236- 达梦数据库的JDBC连接字符串db.name: myDB1- 给这个达梦数据库起个名字otel.poll.interval: 25- 读metrics的时间间隔(单位秒)otel.callback.interval: 30- 发送数据到后端的时间间隔(单位秒)otel.backend.url: http://localhost:4318- OpenTelemetry后端系统的接收端口otel.transport: prometheushttp- 输出数据到后端的Prometheus以及一个支持otlp/http的OpenTelemetry的后端。如果只输出数据到后端的Prometheus可以只写prometheusprometheus.port: 16540- 展现Prometheus的端口prometheus.restricted.metrics: db.sql.elapsed_time,db.lock.time- 这几个metrics拥有高基数不展现到Prometheus端口否则会严重影响Prometheus的性能otel.service.name: DamengA- 展现为OpenTelemetry的“service.name” Resource attribute。如果只输出数据到Prometheus不需要后端系统事先启动。因为OJR Dameng Agent会展现一个支持Prometheus协议的HTTP端口被动地等待Prometheus服务器来读取数据。如果想发送数据到OpenTelemetry后端的话就需要启动一个OpenTelemetry后端因为OJR Dameng Agent会主动地发送数据到OpenTelemetry后端。如果不想看到错误信息的话我们可以先把otel.transport设置为prometheusotel.transport: prometheus现在是启动OJR Dameng Agent的时间了。如果用同步的方式可以使用如下的命令bin/ojr-dameng-db于是我们可以看到类似下述的日志信息Jan 14, 2025 12:23:34 PM com.ojr.core.BasicDcAgent startINFO: DC No.1 is collecting data...Jan 14, 2025 12:23:35 PM com.ojr.dameng.DamengDc collectDataINFO: Start to collect metricsJan 14, 2025 12:23:35 PM com.ojr.core.metric.RawMetric$DataPoint setValueINFO: New metric value: db.status/default1Jan 14, 2025 12:23:35 PM com.ojr.core.metric.RawMetric$DataPoint setValueINFO: New metric value: db.instance.count/default1Jan 14, 2025 12:23:35 PM com.ojr.core.metric.RawMetric$DataPoint setValueINFO: New metric value: db.instance.active.count/default1Jan 14, 2025 12:23:35 PM com.ojr.core.metric.RawMetric$DataPoint setValueINFO: New metric value: db.session.count/default2Jan 14, 2025 12:23:35 PM com.ojr.core.metric.RawMetric$DataPoint setValueINFO: New metric value: db.session.active.count/default1Jan 14, 2025 12:23:36 PM com.ojr.core.metric.RawMetric$DataPoint setValueINFO: New metric value: db.transaction.count/default82260Jan 14, 2025 12:23:36 PM com.ojr.core.metric.RawMetric$DataPoint setValueINFO: New metric value: db.transaction.rate/default82261Jan 14, 2025 12:23:36 PM com.ojr.core.metric.RawMetric$DataPoint setValueINFO: New metric value: db.transaction.latency/default0Jan 14, 2025 12:23:36 PM com.ojr.core.metric.RawMetric$DataPoint setValueINFO: New metric value: db.sql.count/default150200Jan 14, 2025 12:23:37 PM com.ojr.core.metric.RawMetric$DataPoint setValueINFO: New metric value: db.sql.rate/default150200Jan 14, 2025 12:23:37 PM com.ojr.core.metric.RawMetric$DataPoint setValueINFO: New metric value: db.io.read.rate/default548Jan 14, 2025 12:23:37 PM com.ojr.core.metric.RawMetric$DataPoint setValueINFO: New metric value: db.io.write.rate/default92673Jan 14, 2025 12:23:37 PM com.ojr.core.metric.RawMetric$DataPoint setValueINFO: New metric value: db.task.wait_count/default0… …现在OJR Dameng Agent就把达梦数据库的metrics以Prometheus endpoint的形式来展现。可以通过访问http://localhost:16540/metrics来读取这些metrics。下面是一部分metrics的截图# HELP db_cache_hit_ratio The cache hit ratio/percentage # TYPE db_cache_hit_ratio gauge db_cache_hit_ratio{db_namemyDB1,ojrdameng-db,typeFAST} 0.9999864916470558 db_cache_hit_ratio{db_namemyDB1,ojrdameng-db,typeKEEP} 1.0 db_cache_hit_ratio{db_namemyDB1,ojrdameng-db,typeNORMAL} 0.9760178415245243 db_cache_hit_ratio{db_namemyDB1,ojrdameng-db,typeRECYCLE} 0.6585512807157637 db_cache_hit_ratio{db_namemyDB1,ojrdameng-db,typeROLL} 1.0 # HELP db_cpu_utilization_ratio The percentage of used CPU # TYPE db_cpu_utilization_ratio gauge db_cpu_utilization_ratio{db_namemyDB1,ojrdameng-db} 0.0 # HELP db_disk_usage_bytes The size (in bytes) of the used disk space on the file system # TYPE db_disk_usage_bytes gauge db_disk_usage_bytes{db_namemyDB1,ojrdameng-db,pathdefault} 3.14336997376E11 # HELP db_disk_utilization_ratio The percentage of used disk space on the file system # TYPE db_disk_utilization_ratio gauge db_disk_utilization_ratio{db_namemyDB1,ojrdameng-db,pathdefault} 0.923227754037647 # HELP db_instance_active_count The total number of active db instances # TYPE db_instance_active_count gauge db_instance_active_count{db_namemyDB1,ojrdameng-db} 1.0 # HELP db_instance_count The total number of db instances # TYPE db_instance_count gauge db_instance_count{db_namemyDB1,ojrdameng-db} 1.0 # HELP db_io_read_rate_bytes The physical read per second # TYPE db_io_read_rate_bytes gauge db_io_read_rate_bytes{db_namemyDB1,ojrdameng-db} 0.0 # HELP db_io_write_rate_bytes The physical write per second # TYPE db_io_write_rate_bytes gauge db_io_write_rate_bytes{db_namemyDB1,ojrdameng-db} 0.14716162024943893 # HELP db_mem_utilization_ratio The percentage of used memory on the file system # TYPE db_mem_utilization_ratio gauge db_mem_utilization_ratio{db_namemyDB1,ojrdameng-db} 0.06779586465226103 # HELP db_session_active_count The number of active database sessions # TYPE db_session_active_count gauge db_session_active_count{db_namemyDB1,ojrdameng-db} 2.0 # HELP db_session_count Number of sessions # TYPE db_session_count gauge db_session_count{db_namemyDB1,ojrdameng-db} 3.0 # HELP db_sql_count The number of SQLs # TYPE db_sql_count gauge db_sql_count{db_namemyDB1,ojrdameng-db} 153600.0 # HELP db_sql_rate The number of SQL per second # TYPE db_sql_rate gauge db_sql_rate{db_namemyDB1,ojrdameng-db} 7.356727727506805 ... ...支持Prometheus于是我们可以通过向Prometheus配置文件增加如下内容来访问新的达梦数据库数据源scrape_configs:- job_name: dameng-dbscrape_interval: 60sstatic_configs:- targets: [localhost:16540]这样我们就可以使用Grafana Dashboard来浏览达梦数据库的metrics了。下面是dashboard的一个片段Grafana Dashboard的配置可以参照如下的例子Grafana dashboard configuration支持OpenTelemetry下面我们看一下支持OpenTelemetry的后端。支持OpenTelemetry的系统非常多Prometheus只是其中一个后端且只能用于metrics。如果我们修改OJR Dameng的配置文件config/config.yaml把otel.transport的值从“prometheus”改为”prometheushttp”意思就是支持Prometheus和“otlp/http”两种协议那么就可以使用标准的OTLP协议输出OpenTelemetry数据。“otlp/http”的endpoint可以配置默认使用本机的4318端口也就是http://localhost:4318。更多的信息请参照OJR的联机文档。注意每个达梦数据库的实例都要做相应的配置。确保使用的是下面的配置otel.transport: prometheushttp然后重新启动OJR Dameng Agentbin/ojr-dameng-db可以接收OpenTelemetry数据的后端应用非常多比较常用的是OpenTelemetry Collector。OpenTelemetry Collector有很多发行版我这里使用的是opentelemetry-collector-contrib。使用OpenTelemetry Collector接收到达梦数据库的metrics之后可以经过处理发送给OpenTelemetry Collector的下一级后端。我这里有个发送给ClickHouse数据库的例子使用如下的配置receivers:otlp:protocols:grpc:http:cors:allowed_origins:- http://*- https://*exporters:debug:verbosity: detailedclickhouse:endpoint: tcp://127.0.0.1:9000?dial_timeout10susername: defaultpassword: clickmedatabase: testasync_insert: truettl: 72hcompress: lz4create_schema: truelogs_table_name: otel_logstraces_table_name: otel_tracestimeout: 5smetrics_tables:gauge:name: otel_metrics_gaugesum:name: otel_metrics_sumsummary:name: otel_metrics_summaryhistogram:name: otel_metrics_histogramexponential_histogram:name: otel_metrics_exp_histogramretry_on_failure:enabled: trueinitial_interval: 5smax_interval: 30smax_elapsed_time: 300sprocessors:batch:service:pipelines:traces:receivers: [otlp]processors: [batch]exporters: [debug,clickhouse]metrics:receivers: [otlp]processors: [batch]exporters: [debug,clickhouse]logs:receivers: [otlp]processors: [batch]exporters: [debug,clickhouse]这样数据就可以通过OpenTelemetry Collector发布到Clickhouse数据库。Clickhouse数据库没有高基数(high cardinality)这样的限制。我们通过再配置一个Grafana到Clickhouse的连接在Dashboard里面看到一些无法使用Prometheus的metrics比如消耗时间最长的SQL语句等。下面是Grafana dashboard的片段后记本文以达梦数据库为例使用OJR Dameng Agent来通过OpenTelemetry实现可观测性。OJR Dameng Agent还在完善之中如果发现各种问题或者需要提高的地方可以给作者开Ticket。相关的代码在https://github.com/liurui-software/ojr/tree/main/ojr-dameng-db
返回列表