Apache Druid Ambari Metrics Emitter 实战将 Druid 集群指标接入 Ambari Metrics 收集器【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址: https://gitcode.com/gh_mirrors/druid6/druid本文围绕 Apache Druid 的社区扩展ambari-metrics-emitter展开讲解如何把 Druid 各服务Broker、Historical、Overlord 等产生的运行时指标以批量pickled方式发送到 Ambari Metrics CollectorAMS并重点剖析其中的事件转换器Druid to Ambari Timeline Metric Converter与指标命名规范。读完本文你将掌握该扩展的完整配置方法、all与whiteList两种转换器的取舍、白名单映射文件的自定义格式以及底层源码实现的关键细节可直接在真实集群中落地使用。扩展的加载与启用ambari-metrics-emitter是一个独立的 Apache Druid 扩展extension源码位于仓库 extensions-contrib/ambari-metrics-emitter其 Maven 坐标为org.apache.druid.extensions.contrib:ambari-metrics-emitter并且直接依赖org.apache.ambari:ambari-metrics-common见 pom.xml因此目标环境中需要有 Ambari Metrics 相关的服务端组件。使用该扩展的第一步是在 Druid 的扩展加载列表中加入ambari-metrics-emitter具体方式参见官方加载扩展的说明文档 加载扩展。例如在common.runtime.properties中配置druid.extensions.loadList[..., ambari-metrics-emitter] druid.emitterambari-metrics其中druid.emitter用于指定当前进程实际激活的 emitter 名称参考仓库示例配置 common.runtime.properties 中druid.emitternoop的写法此处替换为ambari-metrics后扩展模块 AmbariMetricsEmitterModule 会通过 Guice 以Named(ambari-metrics)的名字注册并托管一个AmbariMetricsEmitter实例其生命周期由ManageLifecycle管理。工作原理批量发送与内部队列该扩展的本质是一个 DruidEmitter实现。核心类 AmbariMetricsEmitter 继承自 Ambari 的AbstractTimelineMetricsSink并实现Emitter接口。从源码可以看到其运行模型每个ServiceMetricEvent被事件转换器转换为一个TimelineMetric后放入一个容量为maxQueueSize的LinkedBlockingQueue队列一个大小为 2 的定时线程池按flushPeriod周期执行ConsumerRunnable从队列中批量取出事件凑满batchSize个就调用emitMetrics()发送一次即文档所说的 pickled, i.e., batched队列清空时若还有剩余不足一批的事件也会被发送发送目标 URI 由源码collectorURI构造逻辑可见形如协议://主机:端口/ws/v1/timeline/metricsWS_V1_TIMELINE_METRICS即/ws/v1/timeline/metrics这一点也被单元测试 AmbariMetricsEmitterTest 验证http://myHost:8080/ws/v1/timeline/metrics。此外该实现明确忽略 Zookeeper 回退getZookeeperQuorum()返回null并关闭了 host 内存聚合isHostInMemoryAggregationEnabled()返回false因此所有 Collector 连接参数都必须通过配置文件显式给出。完整配置参数详解所有配置项统一以druid.emitter.ambari-metrics为前缀对应的配置类为 AmbariMetricsEmitterConfig。完整参数如下property说明必填?默认值druid.emitter.ambari-metrics.hostnameAmbari Metrics ServerCollector的主机名。源码中通过Preconditions.checkNotNull强制非空且由于禁用了 ZK 回退该值必须直接可访问是无druid.emitter.ambari-metrics.portAmbari Metrics Server 的端口是无druid.emitter.ambari-metrics.protocol发送指标使用的协议取值为http或https否httpdruid.emitter.ambari-metrics.trustStorePath使用https时 trustStore 的文件路径否无druid.emitter.ambari-metrics.trustStoreType使用https时 trustStore 的类型否无druid.emitter.ambari-metrics.trustStorePassword使用https时 trustStore 的密码否无druid.emitter.ambari-metrics.batchSize一次批量发送的事件个数否100druid.emitter.ambari-metrics.eventConverterDruid 事件到 Ambari Timeline Metric 的过滤与转换器见下文是无druid.emitter.ambari-metrics.flushPeriod队列刷盘周期单位毫秒否1 分钟druid.emitter.ambari-metrics.maxQueueSize缓冲事件的队列最大容量否MAX_INTdruid.emitter.ambari-metrics.alertEmitters需要转发告警Alert事件的 emitter 名称列表否空列表不转发druid.emitter.ambari-metrics.emitWaitTime入队时的等待时间单位毫秒超时后事件会被丢弃否0druid.emitter.ambari-metrics.waitForEventTime消费者从队列取事件时的最长等待时间单位毫秒否10001 秒说明原文档参数表中trustStorePassword一行误写为trustStoreType本文按 AmbariMetricsEmitterConfig 中的实际JsonProperty(trustStorePassword)予以修正。上述默认值均可从 AmbariMetricsEmitterConfig 的常量定义中得到印证DEFAULT_BATCH_SIZE 100、DEFAULT_FLUSH_PERIOD_MILLIS 1 分钟、DEFAULT_GET_TIMEOUT_MILLIS 1 秒、DEFAULT_PROTOCOL http。其中hostname、port与eventConverter三者均通过Preconditions.checkNotNull强制校验缺失任一配置都会导致启动失败。一个最小可用的配置示例写入common.runtime.propertiesdruid.emitterambari-metrics druid.emitter.ambari-metrics.hostnameams-host.example.com druid.emitter.ambari-metrics.port6188 druid.emitter.ambari-metrics.protocolhttp druid.emitter.ambari-metrics.eventConverter{type:whiteList, namespacePrefix:druid, appName:druid}Ambari Metrics 指标命名规范扩展将转换后的指标以 Timeline Metric 的形式写入 Ambari Metrics其路径metric name遵循如下 schemanamespacePrefix.[druid service name].[druid hostname].druid metrics dimensions.druid metrics name以文档给出的示例druid.historical.hist-host1:8080.MyDataSourceName.GroupBy.query/time为例逐段拆解druid—— namespace prefix命名空间前缀由用户自行定义historical—— druid service name产生指标的服务如 historical、broker、overlordhist-host1:8080—— druid hostname该服务所在节点的主机名与端口MyDataSourceName—— 某个 dimension维度的值此处为数据源名GroupBy—— 另一个 dimension 的值此处为查询类型query/time—— 指标名。命名是否规范直接决定了后续在 Ambari Metrics 中对指标的分类、检索与告警是否正确。需要特别留意的是指标名中不允许出现点号或空白源码中的 AmbariMetricsEmitter#sanitize 会把其中的.和空白统一替换为_因此在设计 namespacePrefix 与维度取值时应避免歧义字符防止不同指标被合并成同名。事件转换器Event Converter转换器接口 DruidToTimelineMetricConverter 定义了一个方法druidEventToTimelineMetric(ServiceMetricEvent)它既充当过滤器对不需要发送的事件返回null也负责定义 Druid 事件维度到 Ambari 指标名的映射关系。该接口通过 Jackson 多态注册了两种实现type分别取all与whiteList值得注意的是当type字段缺失时默认实现为whiteList转换器。Send-All 转换器type: all对应实现 SendAllTimelineEventConverter。它会发送 Druid 服务的全部指标事件并保留所有维度维度按维度名字典序排列后拼入路径namespacePrefix.[druid service name].[druid hostname].dimensions values ordered by dimensions name.metric其中namespacePrefix.[druid service name].[druid hostname].这段前缀由用户控制。配置示例druid.emitter.ambari-metrics.eventConverter{type:all, namespacePrefix: druid.test, appName:druid}appName会被写入 Timeline Metric 的AppId字段源码中metric.setAppId(appName)用于在 Ambari Metrics 侧标记应用名默认值为druid。White-list 转换器type: whiteList对应实现 WhiteListBasedDruidToTimelineEventConverter。它只发送白名单内的指标与维度指标名称为namespacePrefix.druid service name.white-listed dimensions.metric与all转换器不同这里维度的顺序不是按名字排序而是严格遵循白名单映射中维度的声明顺序源码getOrderedDimValues()按whiteListDimsMapper中列表的顺序取值。该转换器内置一份默认白名单映射位于仓库资源文件 defaultWhiteListMap.json。源码readMap()显示当未提供mapPath时从 classpath 加载这份默认映射提供了mapPath时则从该路径读取用户自定义的 JSON 文件。配置示例druid.emitter.ambari-metrics.eventConverter{type:whiteList, namespacePrefix: druid.test, ignoreHostname:true, appName:druid, mapPath:/pathPrefix/fileName.json}注意文档示例中的ignoreHostname参数在当前源码的转换器中并未作为属性使用实际生效的核心参数为namespacePrefix、appName与mapPath。Druid 会产生海量指标官方强烈建议使用whiteList转换器以控制发送到 Ambari Metrics 的数据量与存储成本避免无关指标干扰监控和告警。自定义白名单映射文件白名单映射文件是一个 JSON 对象key 是 Druid 指标名或指标名前缀value 是对应维度名的列表维度名的顺序决定最终指标路径中维度的出现顺序。匹配规则在源码getPrefixKey()中实现先做精确匹配whiteList.containsKey(key)若未命中则在排序映射表中找到小于该指标名的最大前缀键并校验该指标名是否以此前缀开头key.startsWith(headMap.lastKey())。也就是说白名单支持前缀匹配例如配置query即可覆盖query/time、query/cpu/time等所有以query开头的指标。仓库自带的 defaultWhiteListMap.json 内容如下可作为自定义映射的参考模板{ ingest/events: [dataSource], ingest/handoff/failed: [dataSource], ingest/persists: [dataSource], ingest/rows/output: [dataSource], ingest/merge: [dataSource], jvm/gc: [], jvm/mem: [memKind], query/cpu/time: [dataSource, type], query/node/time: [dataSource, type], query/node/ttfb: [dataSource, type], query/partial/time: [dataSource, type], query/segment/time: [dataSource, type], query/segmentAndCache/time: [dataSource, type], query/time: [dataSource, type], query/wait/time: [dataSource, type], segment/count: [dataSource], segment/dropQueue/count: [], segment/loadQueue/count: [], segment/loadQueue/failed: [], segment/loadQueue/size: [], segment/scan/pending: [], segment/scan/active: [], segment/size: [dataSource], segment/usedPercent: [dataSource], segment/added/bytes: [dataSource], segment/nuked/bytes: [dataSource] }由映射可见jvm/gc、segment/loadQueue/count等指标不带维度query/time等查询类指标保留dataSource与type查询类型两个维度从而在 Ambari Metrics 中生成诸如prefix.service.dataSource.type.query/time的指标路径。维度取值为集合类型如多值维度时源码getOrderedDimValues()会取集合的第一个元素作为维度值。参数调优与运维建议结合 AmbariMetricsEmitter 的实现以下几点直接影响稳定性与数据完整性队列容量与丢事件当队列已满时emit()中eventsQueue.offer(..., emitWaitTime, MILLISECONDS)会失败并丢弃事件同时以countLostEvents计数每累计 1000 个丢失事件打印一条 error 日志。若日志频繁出现 Lost total of ... events because of emitter queue is full应调大maxQueueSize或缩短flushPeriod/ 增大batchSize以加快消费。批量与周期batchSize控制每批发送的指标个数默认 100flushPeriod控制消费线程的调度周期默认 1 分钟。两者共同决定指标到达 AMS 的实时性追求更实时监控时应适当调小flushPeriod。告警转发emit()对不同类型的 Druid 事件做了分流——ServiceMetricEvent走转换与入队AlertEvent转发给alertEmitters列表中指定的其他 emitter通过 Guice 按名字查找注入SegmentMetadataEvent被直接忽略未知事件类型则抛出ISE。因此需要告警能力时应在alertEmitters中列出如logging等已配置的 emitter 名称。HTTPS 与 trustStore当protocolhttps时start()中会调用loadTruststore(trustStorePath, trustStoreType, trustStorePassword)加载证书库三个 trustStore 参数需配套填写完整。优雅关闭close()会先执行flush()等待队列清空超时上限为 60 秒再关闭线程池保证进程退出前尽量不丢数据。源码级实现要点速览如果你希望进一步深入该扩展的底层行为以下路径值得精读发送主流程与队列模型AmbariMetricsEmitter.javaemit()、ConsumerRunnable、flush()、sanitize()配置解析与默认值AmbariMetricsEmitterConfig.java转换器接口与类型注册DruidToTimelineMetricConverter.java全量转换实现SendAllTimelineEventConverter.java白名单转换实现含前缀匹配与维度排序WhiteListBasedDruidToTimelineEventConverter.java默认白名单defaultWhiteListMap.json单元测试覆盖 URI 构造、协议、端口、ZK 禁用等行为AmbariMetricsEmitterTest.java。总体而言ambari-metrics-emitter为已有 Ambari 监控体系的 Druid 集群提供了一条低成本的指标接入通道加载扩展、配置 Collector 地址与转换器即可完成对接。生产环境请务必采用whiteList转换器并按需裁剪默认白名单以最小的指标量换取对关键查询、摄取与 Segment 负载的完整可观测性。【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址: https://gitcode.com/gh_mirrors/druid6/druid创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
金山画王Win10/Win11兼容性解决方案 1. 项目概述:为什么今天还要装金山画王?它真不是“古董软件”那么简单金山画王——这个名字对90后、00初的朋友来说,可能像“小霸王学习机”“Windows 98桌面”一样,带着一层怀旧滤镜。但如果你最近在Win10或Win11上点开它&#x… · 2026/9/23 14:36:48
C++序列比对三剑客:mismatch、equal与is_permutation深度解析 1. 这三个算法不是“函数”,而是C标准库里被严重低估的逻辑探针你翻过《C标准库》第2版吗?在第387页右下角,mismatch、equal、is_permutation这三个名字像三颗不起眼的铆钉,被钉在头文件的角落里。它们不生成新容器,不… · 2026/9/23 14:36:48
YOLO鸟类数据集从VOC转YOLO格式到训练避坑全流程 简介:面向目标检测初学者与课程设计学生,这是一套完整的YOLO鸟类检测项目包,整合了原始图像、已标注文件和可直接运行的训练代码,适合作为期末大作业或课堂项目参考,免去自行采集数据与标注的繁琐流程。压缩包内共2000… · 2026/9/23 18:02:19
PSO优化风-水电联合调度:快速求解多约束能源调度问题 简介:本资源是基于粒子群算法(PSO)实现风电-水电(抽水蓄能)联合优化调度的MATLAB仿真程序,面向电力系统优化、新能源并网调度及智能算法应用方向的研究生、工程师与科研人员,解决风电出力波动大… · 2026/9/23 18:02:19
Talos Linux 内核命令行参数权威指南:从 `talos.platform` 到网络、配置注入与安全加固 云原生操作系统容器编排 【免费下载链接】talos Talos Linux is a modern Linux distribution built for Kubernetes. 项目地址: https://gitcode.com/gh_mirrors/ta/talos 点击查看 免费下载 导读
Talos Linux 是一款专为 Kubernetes 打造的现代化 Linux 发行版&… · 2026/9/23 18:02:19
微网容量配置如何应对不确定性?两阶段鲁棒优化与CCG算法解析 简介:面向电力系统、微网优化与鲁棒控制领域的研究者和工程师,代码包提供了基于两阶段鲁棒优化算法的微网多电源容量配置MATLAB源代码。算法兼顾决策阶段与不确定调整阶段,可有效应对可再生能源出力波动和负荷变化等不确定性,帮助… · 2026/9/23 18:02:18
交通灯检测数据集:XML转TXT与YOLO训练实战指南 简介:这是一份面向交通场景目标检测实验的交通标志与交通信号灯数据集,原创并由LabelImg手工标注,覆盖限速牌、警告牌以及红灯、绿灯、黄灯等常见类别,图片为真实路况高清照片,适合目标检测入门、模型效果对比和毕业设… · 2026/9/23 18:02:12
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29