Logo
可观察性

背景 #

如何观测集群的运行状态,使运维人员可以快速掌握当前系统现状,并进行进一步的维护工作,是分布式系统的全新挑战。 登录到具体服务器的点对点运维方式,无法适用于面向大量分布式服务器的场景。 通过对可系统观察性数据的遥测是分布式系统推荐的运维方式。 Tracing(链路跟踪)、 Metrics(指标监控)和 Logging (日志)是系统运行状况的可观察性数据重要的获取手段。

APM(应用性能监控) 是通过对系统可观察性数据进行采集、存储和分析,进行系统的性能监控与诊断,主要功能包括性能指标监控、调用链分析,应用拓扑图等。

DBPlusEngine 并不负责如何采集、存储以及展示应用性能监控的相关数据,而是为应用监控系统提供必要的指标数据。 换句话说,DBPlusEngine 仅负责产生具有价值的数据,并通过标准协议或插件化的方式递交给相关系统。

Tracing 用于获取 SQL 解析与 SQL 执行的链路跟踪信息。DBPlusEngine 默认提供了对 SkyWalking,Zipkin,Jaeger 和 OpenTelemetry 的支持,也支持用户通过插件化的方式开发自定义的 Tracing 组件。

  • 使用 Zipkin 和 Jaeger

通过在 agent 配置文件中开启对应的插件,并配置好 Zipkin 或者 Jaeger 服务器信息即可。

  • 使用 OpenTelemetry

OpenTelemetry 在2019年由 OpenTracing 和 OpenCencus 合并而来。 使用这种方式,只需要在agent配置文件中,根据 OpenTelemetry SDK自动配置说明 ,填写合适的配置即可。

  • 使用 SkyWalking

需要在 agent 配置中配置启用对应插件,并且需要同时配置使用 SkyWalking 的 apm-toolkit 工具。

  • 使用 SkyWalking 的内置自动探针

DBPlusEngine 团队与Apache SkyWalking 团队共同合作,在 SkyWalking 中实现了 DBPlusEngine 自动探针,可以将相关的应用性能数据自动发送到 SkyWalking 中。注意这种方式的自动探针不能与 DBPlusEngine 插件探针同时使用。

Metrics 则用于收集和展示整个集群的统计指标。DBPlusEngine 默认提供了对 Prometheus 的支持。

挑战 #

Tracing 和 Metrics 需要通过埋点来收集系统信息。 大量的埋点使项目核心代码支离破碎,难于维护,且不易定制化统计指标。

目标 #

提供尽量多的性能和统计指标,并隔离核心代码和埋点代码,是 DBPlusEngine 可观察性模块的设计目标。

核心概念 #

代理 #

基于字节码增强和插件化设计,以提供 tracing 和 metrics 埋点,以及日志输出功能。 需要开启代理的插件功能后,才能将监控指标数据输出至第三方 APM 中展示。

APM #

APM 是应用性能监控的缩写。 着眼于分布式系统的性能诊断,其主要功能包括调用链展示,应用拓扑分析等。

Tracing #

链路跟踪,通过探针收集调用链数据,并发送到第三方 APM 系统。

Metrics #

系统统计指标,通过探针收集,并且写入到时序数据库,供第三方应用展示。

使用规范 #

源码编译 #

从 Github 下载 DBPlusEngine 源码,对源码进行编译,操作命令如下。

git clone --depth 1 https://github.com/apache/shardingsphere.git
cd shardingsphere
mvn clean install -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Drat.skip=true -Djacoco.skip=true -DskipITs -DskipTests -Prelease

agent 包输出目录为 shardingsphere-agent/shardingsphere-agent-distribution/target/apache-shardingsphere-${latest.release.version}-shardingsphere-agent-bin.tar.gz

agent 配置 #

  • 目录说明

创建 agent 目录,解压 agent 二进制包到 agent 目录。

mkdir agent
tar -zxvf apache-shardingsphere-${latest.release.version}-shardingsphere-agent-bin.tar.gz -C agent
cd agent
tree 
.
├── conf
│   ├── agent.yaml
│   └── logback.xml
├── plugins
│   ├── shardingsphere-agent-logging-base-${latest.release.version}.jar
│   ├── shardingsphere-agent-metrics-prometheus-${latest.release.version}.jar
│   ├── shardingsphere-agent-tracing-jaeger-${latest.release.version}.jar
│   ├── shardingsphere-agent-tracing-opentelemetry-${latest.release.version}.jar
│   ├── shardingsphere-agent-tracing-opentracing-${latest.release.version}.jar
│   └── shardingsphere-agent-tracing-zipkin-${latest.release.version}.jar
└── shardingsphere-agent.jar

  • 配置说明

agent.yaml 是配置文件,插件有 Jaeger、OpenTracing、Zipkin、OpenTelemetry、Logging、Prometheus。 如果需要开启插件时,只需要注释掉 ignoredPluginNames 中对应的插件即可。

applicationName: shardingsphere-agent
ignoredPluginNames:
  - Jaeger
  - OpenTracing
  - Zipkin
  - OpenTelemetry
  - Logging
  - Prometheus

plugins:
  Prometheus:
    host:  "localhost"
    port: 9090
    props:
      JVM_INFORMATION_COLLECTOR_ENABLED : "true"
  Jaeger:
    host: "localhost"
    port: 5775
    props:
      SERVICE_NAME: "shardingsphere-agent"
      JAEGER_SAMPLER_TYPE: "const"
      JAEGER_SAMPLER_PARAM: "1"
  Zipkin:
    host: "localhost"
    port: 9411
    props:
      SERVICE_NAME: "shardingsphere-agent"
      URL_VERSION: "/api/v2/spans"
      SAMPLER_TYPE: "const"
      SAMPLER_PARAM: "1"
  OpenTracing:
    props:
      OPENTRACING_TRACER_CLASS_NAME: "org.apache.skywalking.apm.toolkit.opentracing.SkywalkingTracer"
  OpenTelemetry:
    props:
      otel.resource.attributes: "service.name=shardingsphere-agent"
      otel.traces.exporter: "zipkin"
  Logging:
    props:
      LEVEL: "INFO"

  • 参数说明;
名称说明取值范围默认值
JVM_INFORMATION_COLLECTOR_ENABLED是否开启 JVM 采集器true、falsetrue
SERVICE_NAME链路跟踪的服务名称自定义shardingsphere-agent
JAEGER_SAMPLER_TYPEJaeger 采样率类型const、probabilistic、ratelimiting、remoteconst
JAEGER_SAMPLER_PARAMJaeger 采样率参数const:0、1,probabilistic:0.0 - 1.0,ratelimiting:> 0,自定义每秒采集数量,remote:需要自定义配置远程采样率管理服务地址,JAEGER_SAMPLER_MANAGER_HOST_PORT1(const 类型)
SAMPLER_TYPEZipkin 采样率类型const、counting、ratelimiting、boundaryconst
SAMPLER_PARAMZipkin 采样率参数const: 0、1,counting:0.01 - 1.0,ratelimiting:> 0,自定义每秒采集数量,boundary: 0.0001 - 1.01(const 类型)
otel.resource.attributesopentelemetry 资源属性字符串键值对(,分割)service.name=shardingsphere-agent
otel.traces.exporterTracing expoterzipkin、jaegerzipkin
otel.traces.sampleropentelemetry 采样率类型always_on、always_off、traceidratioalways_on
otel.traces.sampler.argopentelemetry 采样率参数traceidratio:0.0 - 1.01.0

DB Plus Engine-Proxy 中使用 #

  • 启动脚本

    配置 shardingsphere-agent.jar 的绝对路径到 DBPlusEngine-Proxy 的 start.sh 启动脚本中,请注意配置自己对应的绝对路径。

nohup java ${JAVA_OPTS} ${JAVA_MEM_OPTS} \
-javaagent:/xxxxx/agent/shardingsphere-agent.jar \
-classpath ${CLASS_PATH} ${MAIN_CLASS} >> ${STDOUT_FILE} 2>&1 &
  • 启动插件

通过改造后的 DBPlusEngine-Proxy 的启动脚本启动。

bin/start.sh

正常启动可以在对应的 DBPlusEngine-Proxy 日志查看到 plugin 的启动日志,访问 Proxy 后,可以通过配置的地址查看到 Metric 和 Tracing 的数据。

DBPlusEngine-Driver 中使用 Agent 日志采集功能 #

慢查询日志 #

背景信息

慢查询日志功能,用于将执行耗时超过一定时间的 SQL 语句进行记录,便于 DBA 和开发人员识别可能存在问题的 SQL 语句,是数据库和 SQL 管理的重要参考来源。

参数解释

  • slow-query-log:是否开启慢查询日志功能,默认值为 true。
  • long-query-time:慢查询时间阈值,执行耗时超过该阈值的 SQL 语句才会被记入慢查询日志中。该配置单位为毫秒(ms),默认值为 5000。

前提条件

  • Agent 使用 SLF4J 进行日志桥接输出,所以要求应用程序存在 SLF4J 依赖,并有相关日志输出配置。
  • 慢查询日志功能基于 Agent 技术实现,需要应用程序在启动时配置 javaagent 开启 Agent。

配置示例

  • Agent 配置

conf/agent.yaml 为 Agent 配置文件,默认配置如下。

plugins:
  logging:
    BaseLogging:
      props:
        slow-query-log: true
        long-query-time: 5000

其中,slow-query-log 和 long-query-time 配置的是默认值,表示的意思是:

  1. 开启慢查询日志;

  2. 当 SQL 执行耗时超过 5000 毫秒时,记录慢查询日志。

  • 应用程序日志配置

以常用的 logback 作为日志输出为例,配置如下。

<configuration>
    <property name="log.context.name" value="project-using-DBPlusEngine-Driver" />
    <property name="log.charset" value="UTF-8" />
    <property name="log.pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n" />
    <contextName>${log.context.name}</contextName>
    
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder charset="${log.charset}">
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
  
    <logger name="SLOW-QUERY" level="info" additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>
    
    <root>
        <level value="INFO" />
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

说明: 慢日志输出的 logger name 为 SLOW-QUERY

慢查询日志格式

db: {database name} query_time: {query time} sql_type: {sql type}

{sql}

  • db:数据库名称;
  • query_time:SQL 执行耗时,单位为 ms;
  • sql_type:SQL 类型,(SELECT,INSERT,UPDATE,DELETE,OTHER 其他类型);
  • sql:执行的具体 SQL 语句;

例如:

[WARN ] 2023-01-04 14:55:04.035 [http-nio-8888-exec-7] SLOW-QUERY - db: sharding_db query_time: 21 sql_type: SELECT
SELECT  id,user_id,uuid,status,create_time,update_time,is_deleted AS deleted  FROM t_order

全量审计日志 #

背景信息

全量审计日志,是指开启该功能后,系统将记录所有执行的 SQL 语句,并包含语句对应的数据库、执行耗时、SQL 类型等信息,便于企业进行审计操作。

参数解释

  • general-query-log:全量审计日志仅有一个参数,值为 true 时启用全量日志,值为 false 时停用该功能。

前提条件

  • Agent 使用 SLF4J 进行日志桥接输出,所以要求应用程序存在 SLF4J 依赖,并有相关日志输出配置。

  • 全量审计日志功能基于 Agent 技术实现,需要应用程序在启动时配置 javaagent 开启 Agent。 配置示例

  • Agent 配置

conf/agent.yaml 为 Agent 配置文件,默认配置如下。

plugins:
  logging:
    BaseLogging:
      props:
        general-query-log: true

说明: general-query-log 为 true 时代表开启全量审计日志,为 false 时代表停用全量审计日志。以启动时配置值为准。

  • 应用程序日志配置

以常用的 logback 作为日志输出为例,配置如下。

<configuration>
    <property name="log.context.name" value="project-using-DBPlusEngine-Driver" />
    <property name="log.charset" value="UTF-8" />
    <property name="log.pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n" />
    <contextName>${log.context.name}</contextName>
    
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder charset="${log.charset}">
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
  
    <logger name="GENERAL-QUERY" level="info" additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>
    
    <root>
        <level value="INFO" />
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

说明: 全量审计日志输出的 logger name 为 GENERAL-QUERY

全量审计日志格式

db: {database name} query_time: {query time} sql_type: {sql type}

{sql}

  • db:数据库名称;
  • query_time:SQL 执行耗时,单位为 ms;
  • sql_type:SQL 类型,(SELECT,INSERT,UPDATE,DELETE,OTHER 其他类型);
  • sql:执行的具体 SQL 语句;

例如:

[INFO ] 2023-01-04 14:55:04.035 [http-nio-8888-exec-7] GENERAL-QUERY - db: sharding_db query_time: 21 sql_type: SELECT
SELECT  id,user_id,uuid,status,create_time,update_time,is_deleted AS deleted  FROM t_order