SkyWalking OAP 动态配置Dynamic Configuration完全指南Single/Group 配置模型与七种配置中心接入实战【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址: https://gitcode.com/gh_mirrors/sk/skywalking动态配置是 SkyWalking OAP 后端在不重启进程的前提下从上游配置中心拉取或监听并实时更新运行参数的核心能力。本文以官方文档 dynamic-config.md 为骨架结合configuration模块的源码实现与真实application.yml配置系统讲解 Single 与 Group 两种配置模型、支持的全部配置键以及 DCS、Zookeeper、Etcd、Consul、Apollo、Kubernetes Configmap、Nacos 七种实现方式的接入参数与底层原理。读完本文你将能够在生产环境中自主接入任意一种配置中心并为 OAP 动态热更新告警阈值、慢 SQL 阈值、采样策略、日志级别等运行参数。动态配置机制概述从静态配置到运行时热更新SkyWalking OAP 的绝大多数配置通过application.yml与 OS 系统环境变量设定属于启动时生效的静态配置。与此同时其中一部分配置项支持来自上游管理系统配置中心的动态设置即 OAP 运行期间配置变更可被实时感知并生效无需重启。在源码层面动态配置被抽象为独立的configuration模块定义于 ConfigurationModule.java该模块名为configuration对外暴露的唯一服务接口是DynamicConfigurationService。正如接口注释所述DynamicConfigurationService provides API to register config change watcher整个 OAP 后端中任何希望支持动态化的配置项都可以向该模块注册一个ConfigChangeWatcher配置变更监听器当远端配置值发生变化时监听器的notify回调会被触发从而完成运行时的配置热更新。需要特别强调的是动态配置依赖上游服务因此默认是关闭的DISABLED。只有当你在application.yml中将configuration.selector切换为具体的实现时该能力才会被启用。快速开始启用动态配置在 application.yml 中configuration段落的默认形态如下这也是官方文档给出的配置骨架configuration: selector: ${SW_CONFIGURATION:none} none: grpc: host: ${SW_DCS_SERVER_HOST:} port: ${SW_DCS_SERVER_PORT:80} clusterName: ${SW_DCS_CLUSTER_NAME:SkyWalking} period: ${SW_DCS_PERIOD:20} maxInboundMessageSize: ${SW_DCS_MAX_INBOUND_MESSAGE_SIZE:4194304} # ... other implementations关键点说明selector通过环境变量SW_CONFIGURATION控制默认值为none即不启用任何动态配置none对应的实现是 NoneConfigurationProvider.java它不注册任何监听器配置完全来自本地。将SW_CONFIGURATION设置为grpc、zookeeper、etcd、consul、apollo、k8s-configmap或nacos之一即可启用对应实现每个实现下的子配置同样支持环境变量覆盖。上方的grpc段即官方自研的DCSDynamic Configuration Service配置其中maxInboundMessageSize是实际application.yml中额外提供的参数用于限制从配置服务接收消息的最大字节数默认 41943044MB。启用方式示例以环境变量形式export SW_CONFIGURATIONzookeeper export SW_CONFIG_ZK_HOST_PORT10.0.0.1:2181 export SW_CONFIG_ZK_NAMESPACE/skywalkingSingle Configuration单配置键值对的热更新Single Configuration是最基础的动态配置形态一个配置键configKey对应一个具体的配置值configValue其逻辑结构为{configKey}:{configValue}例如{agent-analyzer.default.slowDBAccessThreshold}:{default:200,mongodb:50}它表示将agent-analyzer.default.slowDBAccessThreshold这个键的值动态设置为default:200,mongodb:50从而覆盖application.yml中agent-analyzer/default/slowDBAccessThreshold的静态取值。支持的 Single 配置键官方文档完整列出当前支持的 Single 配置项如下Config KeyValue Description值说明Value Format Example值格式示例agent-analyzer.default.slowDBAccessThreshold慢数据库语句的阈值。覆盖application.yml中的agent-analyzer/default/slowDBAccessThreshold。default:200,mongodb:50agent-analyzer.default.uninstrumentedGateways未接入探针的网关地址。覆盖gateways.yml。格式同 uninstrumented-gateways.md 中的 Configuration Formatalarm.default.alarm-settings告警规则设置。覆盖alarm-settings.yml。格式同 backend-alarm.md 中的alarm-settings.ymlcore.default.apdexThresholdApdex 阈值设置。覆盖service-apdex-threshold.yml。格式同 apdex-threshold.md 中的service-apdex-threshold.ymlcore.default.endpoint-name-grouping端点名称分组规则。覆盖endpoint-name-grouping.yml。格式同 endpoint-grouping-rules.md 中的endpoint-name-grouping.ymlcore.default.log4j-xmllog4j XML 配置。覆盖log4j2.xml。格式同 dynamical-logging.md 中的log4j2.xmlcore.default.searchableTracesTags可检索的 Trace 标签配置。覆盖application.yml中的core/default/searchableTracesTags。http.method,http.status_code,rpc.status_code,db.type,db.instance,mq.queue,mq.topic,mq.brokeragent-analyzer.default.traceSamplingPolicy默认与按服务维度的采样策略。覆盖trace-sampling-policy-settings.yml。格式同 trace-sampling.md 中的trace-sampling-policy-settings.ymlconfiguration-discovery.default.agentConfigurationsConfigurationDiscovery 设置Java Agent 端配置下发。参见 Java Agent 的 ConfigurationDiscovery 文档从这张表可以看出动态配置覆盖了 OAP 运行中最需要调优即生效的场景数据库慢查询阈值、告警规则、Apdex 阈值、端点分组、日志级别、Trace 检索标签与采样策略等。Single 配置的底层实现在源码中Single 配置对应 ConfigChangeWatcher.java 中WatchType.SINGLE类型的监听器。每个 watcher 由module模块名、provider提供者和itemName配置项名三元组唯一标识ConfigWatcherRegister.java 中将其拼接为形如module.provider.itemName的完整键名this.key String.join(., watcher.getModule(), watcher.getProvider().name(), watcher.getItemName());当远端配置值发生变化时notifySingleValue方法负责比对旧值watcher.value()与新值并触发通知新值为null且旧值非空触发EventType.DELETE事件新值非空且与旧值不同触发EventType.MODIFY事件新旧值相同不通知保持现状。ConfigChangeEvent携带newValue与eventTypeADD/MODIFY/DELETE两个字段最终交给具体配置项的 watcher 执行实际的配置应用逻辑。Group Configuration分组配置一组子项的整体下发Group Configuration是比 Single 更复杂的形态一个配置键对应一组子配置项每个子项本身是一个键值对。其逻辑结构为{configKey}: |{subItemkey1}:{subItemValue1} |{subItemkey2}:{subItemValue2} |{subItemkey3}:{subItemValue3} ...官方示例{core.default.endpoint-name-grouping-openapi}:|{customerAPI-v1}:{value of customerAPI-v1} |{productAPI-v1}:{value of productAPI-v1} |{productAPI-v2}:{value of productAPI-v2}支持的 Group 配置键Config KeySubItem Key Description子项键说明Value Description值说明Value Format Example值格式示例core.default.endpoint-name-grouping-openapi与 openAPI 定义文件相关的服务名例如serviceA。若一个服务名对应多个文件则为每个文件添加一个子项且子项键以.拼接服务名与文件名例如serviceA.API-file1、serviceA.API-file2用于创建端点名称分组规则的 openAPI 定义文件内容yaml 格式格式同 endpoint-grouping-rules.md 中的productAPI-v2.yamlGroup 配置主要服务于 OpenAPI 场景当某个服务的端点需要依据 OpenAPI 定义文件自动生成端点名称分组规则时即可通过该配置键动态下发 YAML 内容并支持一个服务对应多个文件以服务名.文件名作为子项键。Group 配置的底层实现Group 配置对应WatchType.GROUP类型的监听器GroupConfigChangeWatcher。在 ConfigWatcherRegister.java 的notifyGroupValues方法中底层会逐项比对远端下发的子项集合与当前已生效的子项集合并合并出变更清单changedGroupItems远端新增了子项对该子项触发MODIFY或ADD事件远端删除了某个子项对该子项触发DELETE事件子项值未变化不通知。只有存在实际变更时watcher.notifyGroup(changedGroupItems)才会被调用从而保证 OpenAPI 分组规则这类复合配置能够以整组差异的形式精确热更新。底层同步机制拉取模式Fetching与监听模式Listening动态配置的两种数据同步方式在 configuration-api 模块中被抽象为两个抽象类拉取模式FetchingConfigWatcherRegisterFetchingConfigWatcherRegister.java 采用周期性同步任务的方式start()方法启动一个名为ConfigWatcherSync的守护线程调度器通过scheduleAtFixedRate以固定的syncPeriod默认 60 秒周期执行configSync()每次同步分别调用singleConfigsSync()与groupConfigsSync()从远端读取 Single 与 Group 配置表并驱动 watcher 通知。若readConfig返回空实现层判定无变化则本次同步直接跳过通知逻辑。值得注意的是同步任务使用了VirtualThreads.createScheduledExecutor创建调度线程并包裹RunnableWithExceptionProtection即使某次同步抛出异常也不会中断后续调度只会记录错误日志。监听模式ListeningConfigWatcherRegisterListeningConfigWatcherRegister.java 则走客户端监听路线每个 watcher 注册时即调用抽象方法startListening(watcherHolder, configChangeCallback)由具体实现如 Apollo 的实时推送建立长连接监听一旦远端值变化立即通过回调onSingleValueChanged/onGroupValuesChanged触发通知无需轮询变更延迟更低。两种模式的取舍很直观拉取模式实现简单、依赖少适合 Zookeeper/Etcd/Consul/Nacos/DCS 等按周期读值的场景监听模式响应更实时适合具备推送能力的配置中心如 Apollo。七种动态配置实现与完整接入参数官方文档列出的实现清单如下每个实现均有独立的接入文档Dynamic Configuration Service, DCSZookeeper ImplementationEtcd ImplementationConsul ImplementationApollo ImplementationKubernetes Configmap ImplementationNacos Implementation在源码中它们分别对应 server-configuration 下的独立 Maven 模块各模块中的 Provider 均继承自 AbstractConfigurationProvider.java例如ZookeeperConfigurationProvider、EtcdConfigurationProvider、ConsulConfigurationProvider、ApolloConfigurationProvider、ConfigmapConfigurationProvider、NacosConfigurationProvider、GRPCConfigurationProvider。以 ZookeeperConfigurationProvider.java 为例启动时会校验hostPort与namespace是否为空缺失则抛出ModuleStartException拒绝启动避免配置中心不可达时带病运行。以下是从application.yml中整理的、开箱即用的各实现完整参数均可用环境变量覆盖configuration: selector: ${SW_CONFIGURATION:none} none: grpc: # DCS 动态配置服务 host: ${SW_DCS_SERVER_HOST:} # DCS 服务地址 port: ${SW_DCS_SERVER_PORT:80} # DCS 服务端口 clusterName: ${SW_DCS_CLUSTER_NAME:SkyWalking} # 集群名用于区分不同 OAP 集群的配置 period: ${SW_DCS_PERIOD:20} # 拉取周期秒 maxInboundMessageSize: ${SW_DCS_MAX_INBOUND_MESSAGE_SIZE:4194304} apollo: apolloMeta: ${SW_CONFIG_APOLLO:http://localhost:8080} # Apollo Meta 服务地址 apolloCluster: ${SW_CONFIG_APOLLO_CLUSTER:default} # Apollo 集群 apolloEnv: ${SW_CONFIG_APOLLO_ENV:} # Apollo 环境 appId: ${SW_CONFIG_APOLLO_APP_ID:skywalking} # 应用 ID zookeeper: period: ${SW_CONFIG_ZK_PERIOD:60} # 同步周期秒默认 60 namespace: ${SW_CONFIG_ZK_NAMESPACE:/default} # ZK 命名空间/根路径 hostPort: ${SW_CONFIG_ZK_HOST_PORT:localhost:2181} # ZK 连接地址 baseSleepTimeMs: ${SW_CONFIG_ZK_BASE_SLEEP_TIME_MS:1000} # 重试初始等待时间 maxRetries: ${SW_CONFIG_ZK_MAX_RETRIES:3} # 最大重试次数 etcd: period: ${SW_CONFIG_ETCD_PERIOD:60} endpoints: ${SW_CONFIG_ETCD_ENDPOINTS:http://localhost:2379} # 逗号分隔的 etcd 端点 namespace: ${SW_CONFIG_ETCD_NAMESPACE:/skywalking} authentication: ${SW_CONFIG_ETCD_AUTHENTICATION:false} # 是否启用认证 user: ${SW_CONFIG_ETCD_USER:} password: ${SW_CONFIG_ETCD_password:} consul: hostAndPorts: ${SW_CONFIG_CONSUL_HOST_AND_PORTS:1.2.3.4:8500} # 逗号分隔如 1.2.3.4:8500,2.3.4.5:8500 period: ${SW_CONFIG_CONSUL_PERIOD:60} aclToken: ${SW_CONFIG_CONSUL_ACL_TOKEN:} # Consul ACL Token k8s-configmap: period: ${SW_CONFIG_CONFIGMAP_PERIOD:60} namespace: ${SW_CLUSTER_K8S_NAMESPACE:default} # Configmap 所在命名空间 labelSelector: ${SW_CLUSTER_K8S_LABEL:appcollector,releaseskywalking} # 标签选择器 nacos: serverAddr: ${SW_CONFIG_NACOS_SERVER_ADDR:127.0.0.1} # Nacos 地址 port: ${SW_CONFIG_NACOS_SERVER_PORT:8848} # Nacos 端口 group: ${SW_CONFIG_NACOS_SERVER_GROUP:skywalking} # 配置分组 namespace: ${SW_CONFIG_NACOS_SERVER_NAMESPACE:} # 配置命名空间 period: ${SW_CONFIG_NACOS_PERIOD:60} # 同步周期秒 username: ${SW_CONFIG_NACOS_USERNAME:} # 认证用户名 password: ${SW_CONFIG_NACOS_PASSWORD:} # 认证密码 accessKey: ${SW_CONFIG_NACOS_ACCESSKEY:} # 云厂商 AK secretKey: ${SW_CONFIG_NACOS_SECRETKEY:} # 云厂商 SK各实现的详细接入步骤、数据写入格式与示例请分别阅读上述对应文档如 Zookeeper 的节点路径规划见 dynamic-config-zookeeper.mdKubernetes Configmap 的标签选择器用法见 dynamic-config-configmap.md。DCSDynamic Configuration Service协议详解在所有实现中DCS 是 SkyWalking 官方定义的标准 gRPC 协议定义于 configuration-service.proto它要求上游系统按协议实现两个 RPC 方法。OAP 侧启用方式为将selector设为grpc见上文配置段。协议响应核心uuid 变更判定DCS 协议使用uuid标识配置数据是否变化若uuid相同则无需响应配置数据。OAP 通过比对每次拉取到的uuid决定是否应用新配置这是 DCS 实现低开销轮询的关键设计。Single Config 响应实现方法rpc call (ConfigurationRequest) returns (ConfigurationResponse) { }例如 OAP 需要读取配置{agent-analyzer.default.slowDBAccessThreshold}:{default:200,mongodb:50}上游返回的configTable为configTable { name: agent-analyzer.default.slowDBAccessThreshold value: default:200,mongodb:50 }Group Config 响应实现方法rpc callGroup (ConfigurationRequest) returns (GroupConfigurationResponse) {}响应数据为GroupConfigItems groupConfigTable。例如配置{core.default.endpoint-name-grouping-openapi}下有三个子项时返回groupConfigTable { groupName: core.default.endpoint-name-grouping-openapi items { name: customerAPI-v1 value: value of customerAPI-v1 } items { name: productAPI-v1 value: value of productAPI-v1 } items { name: productAPI-v2 value: value of productAPI-v2 } }从 OAP 侧源码看GRPCConfigurationProvider属于拉取模式period参数默认 20 秒直接决定轮询 DCS 的频率结合uuid判定机制即使轮询频繁数据流量也保持在极低水平。完整的 DCS 接入细节如ConfigurationRequest的请求字段与集群名匹配规则见 dynamic-config-service.md。运维实践建议先静态后动态动态配置只覆盖上表列出的少数配置项其余配置仍须通过application.yml与环境变量管理启用动态配置前请确保静态配置已能正常运行。配置键严格一致配置中心中写入的 configKey 必须与文档表格中的键名完全一致如agent-analyzer.default.slowDBAccessThreshold键名由module.provider.itemName拼接而成拼写错误将被FetchingConfigWatcherRegister以 doesnt match any watcher, ignore 告警日志忽略。变更可观测OAP 启动完成首次同步后会以 INFO 级别打印当前注册的全部动态配置键及当前值后续每次同步在 TRACE 级别输出明细可在排查配置未生效问题时开启。按场景选择实现已有 Zookeeper/Etcd/Consul/Nacos 基础设施时直接复用对应实现在 Kubernetes 环境优先考虑k8s-configmap追求推送式低延迟可选 Apollo需要自研配置中台则基于 DCS 协议实现上游服务。版本与范围本文所述配置键与参数以当前仓库application.yml与官方文档为准不同版本之间配置项可能存在差异升级后请以对应版本的文档与配置文件为最终依据。【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址: https://gitcode.com/gh_mirrors/sk/skywalking创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考