ctsdb对接ELK生态组件及grafana

1 概述

    腾讯CTSDB是一款分布式、可扩展、支持近实时数据搜索与分析的时序数据库,且兼容ELK生态组件,用户可以非常方便的使用ELK组件与CTSDB对接。ELK组件提供了丰富的数据处理功能,包括数据采集、数据清洗、可视化图形展示等。常用的ELK生态组件包括Filebeat、Logstash、Kibana。同时,CTSDB也支持Grafana作为可视化平台。常见的ELK架构图如下,

ELK架构图

    下面会对每种组件作介绍并演示使用方法。

2 组件的使用

2.1 Filebeat

     Filebeat是一个轻量级开源日志文件数据搜集器,作为agent安装到服务器上,Filebeat 读取文件内容,发送到 Logstash 进行解析后进入 CTSDB,或直接发送到 CTSDB 进行集中式存储和分析。

2.1.1 Filebeat的使用流程

  1. 安装 Filebeat安装很简单,见https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-installation.html
  2. 配置 Filebeat的配置采用yaml格式文件,主要配置为全局配置、输入配置、输出配置,下节会给出使用样例
  3. 启动 Filebeat启动时可以指定配置文件路径,若不指定则默认使用filebeat.yml

2.1.2 Filebeat使用示例

  • 首先,将Filebeat的安装包解压缩到某一目录,如下所示:
Filebeat目录结构
  • 然后配置filebeat.yml,配置参考如下:
filebeat.shutdown_timeout: 5   # How long filebeat waits on shutdown for the publisher to finish.
max_procs: 4                   # 可同时执行的最大cpu数,默认为操作系统可用的逻辑cpu数
filebeat.spool_size: 102400
filebeat.idle_timeout: 2s
processors:
- drop_fields:                 # 需要drop掉的字段
    fields: ["beat","input_type","source","offset"]
filebeat.prospectors:
- paths: ["/data/log/filebeat-tutorial.log"]   # 样例数据所在的路径
  fields:
    metricname: metric1
  harvester_buffer_size: 1638400
  close_timeout: 0.5h
  scan_frequency: 2s
- paths: ["/mylog/*.log","/mylog1/*.log"]
  fields:
    metricname: table2
  harvester_buffer_size: 1638401
  close_timeout: 0.5h
  scan_frequency: 2s
output.elasticsearch:
  hosts: ["127.0.0.1:9200"]
  index: "%{[fields.indexname]}"  # 通配,可以达到不同类别的数据写入不同index的目的
  username: "root"                # 对于有权限的CTSDB这里需要填用户名和密码
  password: "changeme"
  worker: 2                       # 工作线程数
  loadbalance: true               # 是否开启负载均衡
  bulk_max_size: 512              # 一次bulk的最大文档数
  flush_interval: 2s
  template:
    enabled: false                # 注意:Filebeat启动后会put一个默认的template,对接CTSDB时,需要禁用Filebeat的template

部分样例数据如下:

83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-dashboard3.png HTTP/1.1" 200 171717 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
83.149.9.216 - - [04/Jan/2015:05:13:44 +0000] "GET /presentations/logstash-monitorama-2013/plugin/highlight/highlight.js HTTP/1.1" 200 26185 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
  • 启动Filebeat,并观察CTSDB中对应表的数据:
nohup ./filebeat &
less logs/filebeat  # 查看部分日志,通过日志libbeat.es.published_and_acked_events=100可以看出我们的100条日志都成功写入到es中
2018-05-25T14:32:24+08:00 INFO Non-zero metrics in the last 30s: filebeat.harvester.open_files=1 filebeat.harvester.running=1 filebeat.harvester.started=1 libbeat.es.call_count.PublishEvents=1 libbeat.es.publish.read_bytes=1535 libbeat.es.publish.write_bytes=40172 libbeat.es.published_and_acked_events=100 libbeat.publisher.published_events=100 publish.events=101 registrar.states.current=1 registrar.states.update=101 registrar.writes=2

# 通过kibana或curl查看es中是否有数据写入到metric1
# 命令:
GET metric1/_search
{
  "sort": [
    {
      "@timestamp": {
        "order": "desc"
      }
    }
  ], 
  "docvalue_fields": ["@timestamp", "message"]
}

#结果:
{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 100,
    "max_score": null,
    "hits": [
      {
        "_index": "metric1@1525536000000_30",
        "_type": "doc",
        "_id": "AWOV_o1wBzkw2jsSfrLN",
        "_score": null,
        "fields": {
          "@timestamp": [
            1527229914629
          ],
          "message": [
            "218.30.103.62 - - [04/Jan/2015:05:27:57 +0000] \"GET /blog/geekery/c-vs-python-bdb.html HTTP/1.1\" 200 11388 \"-\" \"Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)\""
          ]
        },
        "sort": [
          1527229914629
        ]
      },
	# 内容太多,这里省略,通过hits.total可以看出,查询命中了100条文档,证明100条log都成功写入CTSDB

上述示例是直接通过Filebeat将原始日志数据写入到CTSDB中,并没有做字段的解析,下节将会介绍通过Logstash解析数据,然后写入CTSDB。

2.2 Logstash

    Logstash是一款具有实时数据解析功能的开源数据收集引擎。Logstash能够搜集各种数据源,并对数据进行过滤、分析、格式化等操作,然后存储到CTSDB。

2.2.1 Logstash使用流程

  1. 安装 Logstash安装较为简单,具体参考https://www.elastic.co/guide/en/logstash/current/installing-logstash.html
  2. 配置 Logstash的主要配置包含三个模块,分别为数据源输入,数据解析规则,数据输出。下节会给出使用样例。
  3. 启动 Logstash启动时,可以指定配置文件,否则,默认使用logstash.yml作为配置,解析规则默认使用pipelines.yml中的配置。

2.2.2 Logstash使用示例

  • 首先,将Logstash的安装包解压缩到某一目录,如下所示:
image.png
  • 然后,创建一个配置文件,当然也可以在logstash.yml和pipelines.yml中进行配置。这里创建一个配置文件名为first-pipeline.conf,配置如下:
# 输入源
input {
    beats {
        port => "5044"
    }
}

# 解析过滤
filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
}

# 输出
output {
    elasticsearch {
        action => "index"
        hosts => [ "localhost:9200" ]
        index => "logstash_metric"  # CTSDB中创建的metric名
        document_type => "doc"
        user => "root"   # 对于有权限的CTSDB需要指定用户名和密码
        password => "changeme"
    }
}

grok filter插件在Logstash默认可用的,其能够将非结构化的数据解析为结构化的数据,具体使用参考文档https://www.elastic.co/guide/en/logstash/6.2/plugins-filters-grok.html

  • 启动Logstash、Filebeat,并观察CTSDB中对应表的数据:
# 这里需要注意的是,Filebeat的输出是Logstash,因此Filebeat的输出项配置改为:
output.logstash:
  hosts: ["localhost:5044"]

# 清空Filebeat的data目录,启动Filebeat
rm data/registry
nohup ./filebeat &

# 启动Logstash
nohup bin/logstash -f first-pipeline.conf --config.reload.automatic &

# 通过kibana或curl查看CTSDB中是否有数据写入到metric1
# 命令:
GET logstash_metric/_search
{
  "sort": [
    {
      "@timestamp": {
        "order": "desc"
      }
    }
  ], 
  "docvalue_fields": ["@timestamp","request", "response", "type", "bytes",  "verb", "agent", "clientip"]
}
# 结果: 
{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 0,
    "successful": 0,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": 0,
    "hits": []
  }
}
# 这里发现结果是空的,说明没有数据没有写入到CTSDB,查看Logstash日志:
[2018-05-25T21:00:07,081][ERROR][logstash.outputs.elasticsearch] Encountered a retryable error. Will Retry with exponential backoff  {:code=>403, :url=>"http://127.0.0.1:9200/_bulk"}
[2018-05-25T21:00:07,081][ERROR][logstash.outputs.elasticsearch] Encountered a retryable error. Will Retry with exponential backoff  {:code=>403, :url=>"http://127.0.0.1:9200/_bulk"}
# 发现bulk出错,并返回403权限错误,仔细验证 用户名和密码,发现并无问题,继续查看es日志:
[2018-05-25T20:59:27,545][WARN ][o.e.p.o.OPackActionFilter] [1505480279000001609] process index failed: Invalid format: "2018-05-25T12:51:18.905Z"
[2018-05-25T20:59:27,547][WARN ][o.e.p.o.OPackActionFilter] [1505480279000001609] process index failed: Invalid format: "2018-05-25T12:51:18.905Z"
# 从es的日志可以看出 ,时间格式解析出错。出错的原因是,笔者建metric时没有指定时间字段的格式,那么CTSDB默认为epoch_millis,因此需要修改下时间格式:
POST /_metric/logstash_metric/update?pretty
{
  "time": {                           
         "name": "@timestamp",
         "format": "strict_date_optional_time"
    }
}
# 重启Logstash、Filebeat重新写入数据,再查看CTSDB:
# 结果
{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 100,
    "max_score": null,
    "hits": [
      {
        "_index" : "logstash_metric@1527004800000_30",
        "_type" : "doc",
        "_id" : "AWOvG0YgQoCkIV2BLcov",
        "_score" : null,
        "fields" : {
          "request" : [
            "/blog/tags/puppet?flav=rss20"
          ],
          "agent" : [
            "\"UniversalFeedParser/4.2-pre-314-svn +http://feedparser.org/\""
          ],
          "@timestamp" : [
            1527651156725
          ],
          "response" : [
            "200"
          ],
          "bytes" : [
            14872
          ],
          "clientip" : [
            "46.105.14.53"
          ],
          "verb" : [
            "GET"
          ],
          "type" : [
            "log"
          ]
        },
        "sort" : [
          1527651156725
        ]
      },

	... ...
 	# 内容太多,这里省略,通过hits.total可以看出,查询命中了100条文档,证明100条log都成功写入CTSDB

    从上述示例,我们可以看出,通过Filebeat采集数据到Logstash,然后利用Logstash的数据解析功能,将日志解析为多个字段,然后写入CTSDB。

2.3 Kibana

    Kibana是一个旨在为Elasticsearch设计的开源的分析和可视化平台。 可以使用Kibana来搜索,查看存储在CTSDB metric中的数据并与其进行交互。可以利用Kibana中丰富的图表、表格、曲线等功能来可视化数据并进行数据分析。

2.3.1 Kibana使用流程

  1. 安装 下载与Elasticseach对应的Kibanna版本,并解压到某一目录。
  2. 配置 Kibana的配置很简单,下节会给出样例。具体配置项含义参考https://www.elastic.co/guide/en/kibana/current/settings.html
  3. 运行 Kibana运行时,默认使用config/kibana.yml作为配置。

2.3.2 Kibana使用示例

  • 首先,将Kibana的安装包解压到某一目录,如下所示
image.png
  • 然后,修改config下的配置文件。主要配置如下:
# config/kibana.yml
# Kibana server监听的端口
server.port: 5601

# Kibana server所绑定的服务器ip
server.host: 127.0.0.1

# 所要连接的CTSDB的url
elasticsearch.url: "http://127.0.0.1:9200"

# 若使用带权限的CTSDB,则需要指定用户名和密码
elasticsearch.username: "root"
elasticsearch.password: "changeme"
  • 启动,并通过浏览器访问kibana
# 启动 
nohup bin/kibana &

    利用ip:port或者域名访问kibana server,如下:

image.png
image.png

    利用开发工具,我们可以很方便的访问CTSDB,如下图所示:

image.png

    在管理页面创建需要访问的索引,如下所示:

image.png

    如果你有日志搜索的需求,可能会使用到搜索功能,如下图所示:

image.png

    从上图,我们发现,搜索的结果出了时间以外,其他啥也没有,原因是CTSDB为了节省存储空间默认没有开启source功能,如果用户有日志搜索的需求,请联系我们开启source。开启source后的效果如下图所示:

image.png

    利用可视化,我们可以构建各种图表,这里以创建Line Chart为例,展示Kibana的图表效果,如下所示:

image.png

    Kibana不仅提供了丰富的可视化图表功能,而且还可以利用仪表盘将我们保存的可视化图表统一展示都一个页面上,非常方便地查看多个指标的变化状态。这里为了展示效果,贴一张我们内部真实的监控数据的仪表盘视图,如下所示:

image.png

2.4 Grafana

    Grafana是一款开源的仪表盘工具,它提供了丰富的图表功能,类似Kibana,利用Grafana精细的展示效果,可以帮助用户有效地进行数据分析。和Kibana不同的是,Grafana支持的数据源种类更多,包含influxdb、opentsdb、Elasticsearch,下面演示利用Grafana来可视化的分析CTSDB中的数据。

2.4.1 Grafana使用流程

  1. 安装 Grafana的安装过程可以参考官方文档http://docs.grafana.org/installation/
  2. 配置 Grafana的配置项较多,可以使用默认的配置,具体配置说明参考http://docs.grafana.org/installation/configuration/
  3. 运行 Grafana运行时,默认使用/etc/grafana/grafana.ini作为配置。

2.4.2 Grafana使用示例

  • 首先,启动grafana服务
sudo service grafana-server start
  • 然后,通过浏览器访问Grafana服务
image.png
  • 创建数据源,建立dashboard,如下所示
image.png

    利用dashboard创建可视化图表,如下图所示:

image.png

    从上图可以看出,Grafana的图表展示效果和Kibana略有区别,但是功能本质上是一样的,这个看用户的个人使用习惯和爱好。同样,Grafana的dashboard也能同时展示多个可视化图表,如下图所示:

image.png

3 小结

    以上为ELK生态组件及Grafana对接CTSDB的详细使用过程,如在使用过程中遇到问题需要解决,欢迎联系我们。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

3 条评论
登录 后参与评论

相关文章

来自专栏Java技术

Linux操作系统安装ELK stack日志管理系统--(2)Elasticsearch与Kibana的安装与使用

Linux操作系统安装ELK stack日志管理系统–(1)Logstash和Filebeat的安装与使用

592
来自专栏程序员的诗和远方

React Native 实现二维码扫描

最近刚好在学习 React Native 想搞个扫描条形码,二维码的小应用,因为涉及硬件接口,而且自己本身并没有原生开发背景,踩了几个坑,记录一下。 扫描...

3618
来自专栏黑白安全

WordPress 4.9.6任意文件删除漏洞利用

WordPress是目前网络上最受欢迎的CMS。约有30%的网站都在使用它。这种广泛的采用,也使其成为了网络犯罪分子非常感兴趣的一个目标.RIPS团队在7个月前...

702
来自专栏FreeBuf

如何利用Fluxion诱惑目标用户获取WPA密码

前言 由于ISP替代了易受攻击的路由器,供渗透测试人员选择的诸如Reaver这样的工具越来越少,对于特定的目标,哪些工具有用与否能够确定的也很少。而如果采用暴力...

2276
来自专栏ZKEASOFT

ASP .Net Core 2.0 修改默认端口

ASP .Net Core 的默认端口是5000,如果想在同一台服务器上运行多个实例,就不能都监听5000端口了,需要每一个实例都监听不同的端口。当然,如果您正...

29211
来自专栏FreeBuf

2018最新款渗透测试框架 | Fsociety搞定各种姿势脚本

Fsociety是一款最新的渗透测试框架,可以帮助各位兄弟在安全测试过程中拥有变身成黑客所需要的各种姿势脚本。 这个工具刚刚出现,目前大概分为以下9类,后续还会...

2278
来自专栏安智客

Android手机启动流程与TEE OS

一个移植了TEEOS的Android手机系统启动流程如下: ? 系统启动流程如图所示,具体为: ①系统上电,PC指针指向芯片内部BOOT ROM地址并执行。 ...

2537
来自专栏FreeBuf

利用Burp Suite对OWASP Juice Shop进行渗透测试

1. 简介 OWASP 的 在线果汁商店 (Juice Shop) 项目, 是一个很好的开源Web 靶场。它包含了OWASP的10大漏洞 [1], 并且这个项目...

22210
来自专栏友弟技术工作室

iptables系列五

iptables系列之layer7 ? 一块网卡多个IP,这张网卡上连接一个交换机,交换机上连接了多个不同网段的主机,如果设置网关,以及转发功能。不同网段主机可...

2635
来自专栏源哥的专栏

基于linux的嵌入IPv4协议栈的内容过滤防火墙系统(8)-附录

0 通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用一种通常的闭合端口

572

扫码关注云+社区