You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何抓取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:02:57