如何抓取DNS服务器named统计数据并推送至Elastic实现可视化?
抓取BIND named统计并实现Elastic可视化方案
一、定期生成named统计文件
先确保named能定期输出统计到named_stats.txt,可通过两种方式:
- 手动触发:执行
rndc stats命令生成统计 - 自动定期生成:在
named.conf中添加配置,让named按周期更新统计文件:
statistics-file "/var/named/named_stats.txt"; stats-interval 60; # 每60秒生成一次统计,可按需调整
二、Logstash解析配置(解决grok匹配问题)
针对你提供的named_stats.txt格式,以下是完整的Logstash配置,实现统计数据的结构化解析:
1. Input配置(监控统计文件)
input { file { path => "/var/named/named_stats.txt" start_position => "beginning" sincedb_path => "/dev/null" # 适配统计文件定期覆盖的场景,确保每次读取完整内容 codec => plain { charset => "UTF-8" } } }
2. Filter配置(核心解析逻辑)
通过grok匹配行结构,结合aggregate插件聚合同一View下的统计项:
filter { # 标记统计块开头 if [message] =~ /^\++ Cache Statistics \++/ { mutate { add_tag => ["cache_stats_block"] } } # 识别View名称并初始化聚合上下文 if [message] =~ /^\[View:/ { grok { match => { "message" => "\[View: %{DATA:current_view}\]" } remove_field => ["message"] } aggregate { task_id => "%{current_view}" code => "map['view'] = event.get('current_view'); map['stats'] = {}" map_action => "create" } } # 匹配具体统计行,规范化键名后加入聚合 if [message] =~ /^\s+\d+/ { grok { match => { "message" => "^%{SPACE}%{NUMBER:stat_value:int} %{DATA:stat_key}" } remove_field => ["message"] } # 把统计键名转为下划线分隔的小写格式,适配Elastic字段规范 mutate { gsub => ["stat_key", " ", "_"] gsub => ["stat_key", "\(", ""] gsub => ["stat_key", "\)", ""] lowercase => ["stat_key"] } aggregate { task_id => "%{current_view}" code => "map['stats'][event.get('stat_key')] = event.get('stat_value')" map_action => "update" } drop {} # 丢弃原始行,只保留聚合后的结构化文档 } # 匹配View结束行,输出聚合后的完整文档 if [message] =~ /^\[View:.*\]$/ and "cache_stats_block" in [tags] { aggregate { task_id => "%{current_view}" code => "event.set('stats', map['stats']); event.set('view', map['view'])" map_action => "update" end_of_task => true timeout => 30 } # 将嵌套的stats字段展开到根级别,方便Elastic搜索与可视化 mutate { add_field => { "ipv4_queries_sent" => "%{[stats][ipv4_queries_sent]}" "ipv4_responses_received" => "%{[stats][ipv4_responses_received]}" "cache_hits" => "%{[stats][cache_hits]}" "cache_misses" => "%{[stats][cache_misses]}" "nxdomain_received" => "%{[stats][nxdomain_received]}" "servfail_received" => "%{[stats][servfail_received]}" # 按需添加其他需要的统计字段 } remove_field => ["stats", "current_view"] } mutate { remove_tag => ["cache_stats_block"] } } # 过滤空行与无关行 if [message] == "" { drop {} } }
3. Output配置(推送至Elasticsearch)
output { elasticsearch { hosts => ["http://your-elastic-host:9200"] index => "named-stats-%{+YYYY.MM.dd}" # 按日期分片存储 } }
三、Elastic仪表板可视化方案
数据导入Elastic后,可创建以下针对性可视化组件:
- 数值卡片:展示
cache_hits、cache_misses、ipv4_queries_sent等核心指标的实时值,选择「Metric」类型,聚合方式用「Last value」。 - 命中率趋势折线图:计算
cache_hits/(cache_hits+cache_misses)得到缓存命中率,用折线图展示时间维度的趋势变化,快速定位缓存效率波动。 - RTT分布柱状图:将
queries_with_rtt_lt_10ms、queries_with_rtt_10-100ms等RTT区间字段作为Y轴,时间作为X轴,直观展示请求响应耗时分布。 - 异常指标监控图:用折线图展示
nxdomain_received、servfail_received的变化趋势,及时发现DNS解析异常问题。
内容的提问来源于stack exchange,提问作者hardeepsingh
相关产品推荐
相关产品推荐

