ARTICLE DETAIL

资讯详情

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

Apache Druid Graphite Emitter 扩展完全指南:将 Druid 指标实时接入 Graphite 监控体系

Apache Druid Graphite Emitter 扩展完全指南:将 Druid 指标实时接入 Graphite 监控体系 数据库OLAP大数据后端【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址https://gitcode.com/gh_mirrors/druid6/druid点击查看免费下载本文围绕 Apache Druid 官方扩展graphite-emitter展开讲解如何将 Druid 各服务Broker、Historical、Coordinator、Overlord 等产生的服务指标Service Metrics通过 plaintext 或 pickle 协议批量发送到 Graphite Carbon 服务器并详细说明 Druid 指标事件到 Graphite 指标路径metric path的转换机制、Send-All 与 White-List 两种事件转换器的配置方法以及背后的源码实现细节。读完本文你将能够独立完成 Druid 与 Graphite 的对接配置并根据业务需要设计出结构清晰、无命名冲突的 Graphite 指标树。扩展简介为什么需要 Graphite EmitterApache Druid 内置的监控体系会周期性采集查询执行、数据摄入、协调调度等维度的指标完整指标清单见 Metrics 文档但这些指标默认只停留在 Druid 进程内部。要将其纳入企业级时序监控与告警体系就需要借助 Emitter 把指标推送到外部系统。graphite-emitter正是这样一座桥梁它位于 extensions-contrib/graphite-emitter将 Druid 的服务指标事件转换为 Graphite 事件后发送到 Graphite Carbon 服务器。该扩展支持 Graphite 两种经典投递协议plaintext 协议逐条发送单个指标实现简单但效率较低pickle 协议支持批量发送可在一次请求中携带多条指标批量大小可配置效率更高。从源码 GraphiteEmitterConfig.java 可以看到两种协议的常量定义以及默认批量大小 100、默认刷新周期 1 分钟等关键默认值。加载扩展graphite-emitter是一个独立分发的 contrib 扩展。使用前需要先将其加入 Druid 的扩展加载列表druid.extensions.loadList[graphite-emitter]关于扩展加载的完整说明见 Extensions 文档。加载完成后Druid 的 Guice 模块 GraphiteEmitterModule.java 会通过JsonConfigProvider.bind(binder, druid.emitter.graphite, GraphiteEmitterConfig.class)绑定配置并以 emitter 类型名graphite注册因此还需要在配置中启用该 emitterdruid.emitter相关配置见 Metrics 文档。配置参数详解Graphite Emitter 的所有配置参数统一位于druid.emitter.graphite前缀之下。完整参数清单如下表继承自官方文档属性描述必填默认值druid.emitter.graphite.hostnameGraphite 服务器的主机名。是无druid.emitter.graphite.portGraphite 服务器的端口。是无druid.emitter.graphite.batchSize一次批量发送的事件数量仅 pickle 协议生效。否100druid.emitter.graphite.protocolGraphite 协议可选值pickle、plaintext。否pickledruid.emitter.graphite.eventConverterDruid 事件到 Graphite 事件的过滤器与转换器详见下一节。是无druid.emitter.graphite.flushPeriod队列刷新的周期毫秒。否1 分钟druid.emitter.graphite.maxQueueSize用于缓冲事件队列的最大大小。否MAX_INTdruid.emitter.graphite.alertEmitters告警alerts将被转发到的 emitter 列表JSON 列表格式例如[logging, http]。否空列表不转发druid.emitter.graphite.requestLogEmitters请求日志即druid.request.logging.type设为emitter时发送给 emitter 的查询日志事件将被转发到的 emitter 列表JSON 列表格式例如[logging, http]。否空列表不转发druid.emitter.graphite.emitWaitTime尝试发送事件时的等待时间毫秒超时则丢弃该事件。否0druid.emitter.graphite.waitForEventTime若有必要等待事件变为可用的时间毫秒。否10001 秒这些默认值均可以在 GraphiteEmitterConfig.java 的构造逻辑中得到印证waitForEventTime默认DEFAULT_GET_TIMEOUT_MILLIS即 1 秒用于消费者线程从队列取事件时的阻塞等待emitWaitTime默认 0即生产者在队列满时不等待、立即放弃入队flushPeriod默认 1 分钟决定消费者线程的定时调度间隔maxQueueSize默认Integer.MAX_VALUE即不设上限hostname、port与eventConverter均通过Preconditions.checkNotNull强校验缺失会导致启动失败。一个完整的最小配置示例druid.emittergraphite druid.emitter.graphite.hostnamegraphite.example.com druid.emitter.graphite.port2003 druid.emitter.graphite.protocolpickle druid.emitter.graphite.batchSize100 druid.emitter.graphite.flushPeriod60000 druid.emitter.graphite.maxQueueSize100000 druid.emitter.graphite.eventConverter{type:whiteList, namespacePrefix: druid.prod, ignoreHostname:true}支持的事件类型与事件分流Graphite Emitter只向 Graphite 发送服务指标事件ServiceMetricEvent完整指标列表见 Metrics 文档。告警AlertEvent与请求日志RequestLogEvent不会被发送到 Graphite原因正如官方文档所指出Graphite 更适合承载数值型时序指标而非非数值型的日志事件。对于这两类事件扩展提供了转发机制告警事件转发到druid.emitter.graphite.alertEmitters指定的 emitter 列表如logging、http请求日志事件转发到druid.emitter.graphite.requestLogEmitters指定的 emitter 列表。这一分流逻辑体现在 GraphiteEmitter.java 的emit()方法中ServiceMetricEvent经转换器处理后入队发送RequestLogEvent与AlertEvent分别遍历对应的 emitter 列表逐个转发若未配置转发 emitterAlertEvent会被丢弃并记录一条错误日志SegmentMetadataEvent则被直接忽略。从源码还可以看到emitter 名称到具体 Emitter 实例的解析由 GraphiteEmitterModule.java 通过 Guice 的Named依赖注入完成。Druid 到 Graphite 的事件转换器Event Converter指标路径Metric Path的命名 Schema事件转换器的核心职责有两层一是过滤决定哪些事件可以发送到 Graphite二是映射将 Druid 指标名加维度转换为 Graphite 指标路径。Graphite 指标路径遵循如下统一 SchemanamespacePrefix.[druid service name].[druid hostname].druid metrics dimensions.druid metrics name以官方文档给出的示例路径druid.historical.hist-host1_yahoo_com:8080.MyDataSourceName.GroupBy.query/time为例逐段拆解druid—— namespace 前缀historical—— Druid 服务名hist-host1.yahoo.com:8080—— Druid 主机名注意源码的 sanitize 逻辑会把点号替换为下划线实际发送时为hist-host1_yahoo_com:8080MyDataSourceName—— 维度值GroupBy—— 维度值query/time—— 指标名。指标的命名直接决定 Graphite 中数据树的形态命名不当会造成指标冲突、数据混淆以及后续误读因此官方文档特别强调恰当命名指标至关重要。转换器接口与类型注册转换器统一实现DruidToGraphiteEventConverter接口见 DruidToGraphiteEventConverter.java。该接口定义了druidEventToGraphite(ServiceMetricEvent)方法返回GraphiteEvent表示该事件应被发送返回null则表示被过滤。Jackson 通过JsonSubTypes注册了两种实现其中默认实现是whiteListtype all→SendAllGraphiteEventConvertertype whiteList→WhiteListBasedConverter转换后的GraphiteEvent见 GraphiteEvent.java遵循 Graphite 明文协议的标准三字段格式metric path metric value metric timestamp其中时间戳为 Unix 秒由 Druid 事件创建时间的毫秒值转换而来。Send-All 转换器type: allSendAllGraphiteEventConverter见 SendAllGraphiteEventConverter.java会发送所有Druid 服务指标事件。其指标路径形式为namespacePrefix.[druid service name].[druid hostname].按维度名排序后的维度值.metric用户完全掌控namespacePrefix.[druid service name].[druid hostname].三段前缀的取舍设置ignoreHostnametrue可省略主机名例如druid.SERVICE_NAME.dataSourceName.queryType.query/time设置ignoreServiceNametrue可省略服务名例如druid.HOSTNAME.dataSourceName.queryType.query/time。默认情况下指标名中的元素以/分隔因此 Graphite 中所有指标都落在同一层级。若希望指标呈现树状层级结构设置replaceSlashWithDottrue即可把/替换为.原始druid.HOSTNAME.dataSourceName.queryType.query/time转换后druid.HOSTNAME.dataSourceName.queryType.query.time从源码可见all转换器使用ImmutableSortedSet对维度名做字典序排序后依次拼接维度值保证指标路径的确定性四个布尔开关均默认为false而namespacePrefix为必填项同样有checkNotNull强校验。Send-All 转换器的配置示例druid.emitter.graphite.eventConverter{type:all, namespacePrefix: druid.test, ignoreHostname:true, ignoreServiceName:true}White-List 转换器type: whiteListWhiteListBasedConverter见 WhiteListBasedConverter.java只发送白名单中列出的指标及维度。与all转换器相同namespacePrefix.[druid service name].[druid hostname].前缀部分同样由用户掌控。白名单映射whiteListDimsMapper的结构是键为指标名或指标名前缀值为该指标需要保留的维度名列表。这里有一个关键细节维度名的顺序很重要它会直接决定 Graphite 指标路径中各维度值的排列顺序。例如源码注释中举例若维度type嵌套于dataSource之下则路径为prefix.dataSource.queryType.metricName。默认白名单映射文件位于扩展的 classpath 资源中defaultWhiteListMap.json。其实际内容涵盖了ingest/events、ingest/persists、jvm/gc、jvm/mem、query/cpu/time、query/node/time、query/node/ttfb、query/segment/time、query/segmentAndCache/time、query/time、query/wait/time、segment/count、segment/size等常用指标其中query/*类指标指定保留dataSource与type两个维度其余指标不保留额外维度空数组。用户可以通过mapPath属性提供自定义白名单文件覆盖默认映射。mapPath是一个字符串指向包含白名单映射 JSON 对象的文件路径。例如下面的配置会让转换器从文件/pathPrefix/fileName.json读取映射druid.emitter.graphite.eventConverter{type:whiteList, namespacePrefix: druid.test, ignoreHostname:true, ignoreServiceName:true, mapPath:/pathPrefix/fileName.json}自定义白名单文件的 JSON 结构与默认文件一致例如{ query/time: [dataSource, type], jvm/mem: [] }从 WhiteListBasedConverter.java 的实现细节可以了解白名单的匹配与维度取值规则前缀匹配getPrefixKey()先做键的精确匹配若未命中则利用SortedMap.headMap找到小于当前指标名的最大键并检查指标名是否以该键开头——因此白名单中的query/time同样能匹配query/time/balaba这样的扩展指标维度值提取getOrderedDimValues()严格按照白名单中维度的声明顺序取值维度值既可以是字符串也可以是集合如字符串数组维度集合类型只取第一个元素作为路径段过滤生效druidEventToGraphite()首先调用isInWhiteList()判断指标名未命中任何白名单键含前缀的事件直接返回null即不会发送到 Graphite。这一行为在测试 WhiteListBasedConverterTest.java 中有充分验证默认白名单下query/time、query/node/ttfb、query/segmentAndCache/time、query/time/balaba前缀命中、segment/count、segment/size、ingest/persists/time、jvm/mem/init、jvm/gc/count均可发送而query/tim、segment/added/bytes、segment/cost/raw、jvm/bufferpool/capacity等则被过滤。维度顺序方面测试验证了带dataSource、type维度的事件会生成...data-source.groupBy.query/time这样的路径。官方明确建议Druid 会产生海量指标强烈推荐使用whiteList转换器以控制发送到 Graphite 的数据量与指标树规模。底层发送机制与可靠性设计了解发送管道有助于在生产环境调优。从 GraphiteEmitter.java 可以看出其内部架构有界缓冲队列LinkedBlockingQueue容量由maxQueueSize决定双线程调度内部使用两个 daemon 线程的ScheduledExecutorService线程名格式为GraphiteEmitter-%s其中一个按flushPeriod周期调度消费者任务消费者与协议适配ConsumerRunnable根据协议选择发送器——plaintext使用 codahale metrics 的Graphitepickle使用PickledGraphite批量大小即batchSize路径净化sanitize所有路径段服务名、主机名、维度值、指标名都会经过sanitize()处理将连续的空白与点号替换为下划线开启replaceSlashWithDot时再将/替换为.。这就是示例中主机名hist-host1.yahoo.com:8080会变成hist-host1_yahoo_com:8080的原因队列溢出保护当队列已满且超过emitWaitTime时事件会被丢弃并累计丢失计数每丢失 1000 个事件记录一条 error 日志提示增大队列容量或提高消费频率断线重连消费者在发送过程中遇到SocketException例如长时间空闲导致 socket 被关闭时会主动close()后重新connect()保证与 Graphite 服务器连接的健壮性优雅关闭flush()会立即调度一次消费任务并最多等待 1 分钟close()先 flush 再关闭线程池。实战建议首选 White-List 转换器Druid 的指标数量庞大若全部发送会给 Graphite 造成压力并污染指标树建议基于 defaultWhiteListMap.json 按需裁剪并用mapPath指向自维护的白名单文件。合理设计 namespace 前缀在多环境dev/staging/prod或多集群共用同一 Graphite 时务必通过namespacePrefix区分避免指标互相覆盖。按需取舍主机名与服务名若节点会频繁扩容缩容建议ignoreHostnametrue以避免指标树碎片化若需要按服务类型聚合保留 service name 更合理。权衡协议与批量参数默认pickle协议配合batchSize100适合大多数场景若单条指标延迟敏感或 Graphite 端不支持 pickle可退回plaintext此时batchSize不生效。配置告警与请求日志转发Graphite 不适合承载文本日志将alertEmitters、requestLogEmitters指向logging等 emitter可补齐监控盲区而不破坏指标树结构。赞分享数据库OLAP大数据后端【免费下载链接】druidApache Druid: a high performance real-time analytics database.项目地址https://gitcode.com/gh_mirrors/druid6/druid点击查看免费下载相关推荐Apache Druid Graphite Emitter 指南将 Druid 指标通过 Pickle 协议送入 Graphite CarbonApache Druid Graphite Emitter 指南将 Druid 指标通过 Pickle 协议送入 Graphite Carbon 本文以 Ap数据库数据分析OLAP大数据实时分析数据仓库后端Apache Druid Ambari Metrics Emitter 扩展将 Druid 指标接入 Ambari Metrics 监控体系Apache Druid Ambari Metrics Emitter 扩展将 Druid 指标接入 Ambari Metrics 监控体系 导读 本文围绕数据库数据分析OLAP大数据实时分析数据仓库后端Apache Druid Dropwizard Emitter 集成指南将 Druid 指标无缝接入 Dropwizard 监控体系Apache Druid Dropwizard Emitter 集成指南将 Druid 指标无缝接入 Dropwizard 监控体系 Dropwizard E数据库OLAP大数据后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表