Getting started with Kapacitor

Kapacitor是一个数据处理引擎,可同时处理流数据和批处理数据. 本指南将介绍这两个工作流程,并讲解使用Kapacitor的基本知识.

Requirements

The use case

本指南遵循经典用例,该用例会触发服务器上的CPU使用率过高的警报. CPU数据是Telegraf生成的默认系统指标之一.

The process

  1. 安装InfluxDB和Telegraf.
  2. 启动InfluxDB并从Telegraf发送数据.
  3. 安装电容器.
  4. 启动电容器.
  5. 定义并运行流任务以触发CPU警报.
  6. 定义并运行批处理任务以触发CPU警报.

Installing

TICKStack服务可以作为Systemd的一部分安装在主机上运行,​​也可以从Docker容器运行. 本指南将重点介绍它们与Systemd服务在同一主机上的安装和运行.

如果您想探索使用这些组件的Docker部署, 请查看这些说明.

InfluxDB,Telegraf和Kapacitor应用程序将需要按此顺序安装在同一主机上.

所有示例均假定Kapacitor在http://localhost:9092上运行,并且InfluxDB在http://localhost:8086 .

InfluxDB + Telegraf

如果可用,请使用Linux系统软件包( .deb.rpm )安装InfluxDB .

使用systemctl启动InfluxDB:

$ sudo systemctl start influxdb

验证InfluxDB启动:

$ sudo journalctl -f -n 128 -u influxdb
zář 01 14:47:43 algonquin systemd[1]: Started InfluxDB is an open-source, distributed, time series database.
zář 01 14:47:43 algonquin influxd[14778]:  8888888           .d888 888                   8888888b.  888888b.
zář 01 14:47:43 algonquin influxd[14778]:    888            d88P"  888                   888  "Y88b 888  "88b
zář 01 14:47:43 algonquin influxd[14778]:    888            888    888                   888    888 888  .88P
zář 01 14:47:43 algonquin influxd[14778]:    888   88888b.  888888 888 888  888 888  888 888    888 8888888K.
zář 01 14:47:43 algonquin influxd[14778]:    888   888 "88b 888    888 888  888  Y8bd8P\' 888    888 888  "Y88b
zář 01 14:47:43 algonquin influxd[14778]:    888   888  888 888    888 888  888   X88K   888    888 888    888
zář 01 14:47:43 algonquin influxd[14778]:    888   888  888 888    888 Y88b 888 .d8""8b. 888  .d88P 888   d88P
zář 01 14:47:43 algonquin influxd[14778]:  8888888 888  888 888    888  "Y88888 888  888 8888888P"  8888888P"
zář 01 14:47:43 algonquin influxd[14778]: [I] 2017-09-01T12:47:43Z InfluxDB starting, version 1.3.5, branch HEAD, commit 9d9001036d3585cf21925c13a57881bc6c8dcc7e
zář 01 14:47:43 algonquin influxd[14778]: [I] 2017-09-01T12:47:43Z Go version go1.8.3, GOMAXPROCS set to 8
zář 01 14:47:43 algonquin influxd[14778]: [I] 2017-09-01T12:47:43Z Using configuration at: /etc/influxdb/influxdb.conf
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z Using data dir: /var/lib/influxdb/data service=store
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z opened service service=subscriber
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z Starting monitor system service=monitor
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z 'build' registered for diagnostics monitoring service=monitor
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z 'runtime' registered for diagnostics monitoring service=monitor
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z 'network' registered for diagnostics monitoring service=monitor
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z 'system' registered for diagnostics monitoring service=monitor
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z Starting precreation service with check interval of 10m0s, advance period of 30m0s service=shard-precreation
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z Starting snapshot service service=snapshot
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z Starting continuous query service service=continuous_querier
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z Starting HTTP service service=httpd
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z Authentication enabled:false service=httpd
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z Listening on HTTP:[::]:8086 service=httpd
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z Starting retention policy enforcement service with check interval of 30m0s service=retention
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z Listening for signals
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z Sending usage statistics to usage.influxdata.com
zář 01 14:47:44 algonquin influxd[14778]: [I] 2017-09-01T12:47:44Z Storing statistics in database '_internal' retention policy 'monitor', at interval 10s service=monitor
...

接下来,使用Linux系统软件包( .deb.rpm )安装Telegraf (如果有).

Telegraf安装并启动后,将按照默认配置将系统指标发送到InfluxDB,后者会自动创建" telegraf"数据库.

Telegraf配置文件位于其默认位置: /etc/telegraf/telegraf.conf . 对于此介绍,值得注意的是与Kapacitor任务相关的一些值,如下所示. 即:

  • [agent].interval声明将系统指标发送到InfluxDB的频率
  • [[outputs.influxd]] -声明如何连接到InfluxDB和目标数据库,该数据库是默认的" telegraf"数据库.
  • [[inputs.cpu]] -声明如何收集要发送到InfluxDB的系统cpu指标.

示例-/ /etc/telegraf/telegraf.conf相关部分

[agent]
  ## Default data collection interval for all inputs
  interval = "10s"

...
[[outputs.influxdb]]
  ## The HTTP or UDP URL for your InfluxDB instance.  Each item should be
  ## of the form:
  ##   scheme "://" host [ ":" port]
  ##
  ## Multiple urls can be specified as part of the same cluster,
  ## this means that only ONE of the urls will be written to each interval.
  # urls = ["udp://localhost:8089"] # UDP endpoint example
  urls = ["http://localhost:8086"] # required
  ## The target database for metrics (telegraf will create it if not exists).
  database = "telegraf" # required
...
[[inputs.cpu]]
  ## Whether to report per-cpu stats or not
  percpu = true
  ## Whether to report total system cpu stats or not
  totalcpu = true
  ## If true, collect raw CPU time metrics.
  collect_cpu_time = false

Telegraf安装后可能已经启动.

Check the current status of the Telegraf service:

 $ sudo systemctl status telegraf
● telegraf.service - The plugin-driven server agent for reporting metrics into InfluxDB
   Loaded: loaded (/lib/systemd/system/telegraf.service; enabled; vendor preset: enabled)
   Active: active (running) since Pá 2017-09-01 14:52:10 CEST; 20min ago
     Docs: https://github.com/influxdata/telegraf
 Main PID: 15068 (telegraf)
    Tasks: 18
   Memory: 14.4M
      CPU: 6.789s
   CGroup: /system.slice/telegraf.service
           └─15068 /usr/bin/telegraf -config /etc/telegraf/telegraf.conf -config-directory /etc/telegraf/telegraf.d

zář 01 14:52:10 algonquin systemd[1]: Started The plugin-driven server agent for reporting metrics into InfluxDB.
zář 01 14:52:11 algonquin telegraf[15068]: 2017-09-01T12:52:11Z I! Starting Telegraf (version 1.3.3)
zář 01 14:52:11 algonquin telegraf[15068]: 2017-09-01T12:52:11Z I! Loaded outputs: influxdb
zář 01 14:52:11 algonquin telegraf[15068]: 2017-09-01T12:52:11Z I! Loaded inputs: inputs.cpu inputs.disk inputs.diskio inputs.kernel inputs.mem inputs.processes in
zář 01 14:52:11 algonquin telegraf[15068]: 2017-09-01T12:52:11Z I! Tags enabled: host=algonquin
zář 01 14:52:11 algonquin telegraf[15068]: 2017-09-01T12:52:11Z I! Agent Config: Interval:10s, Quiet:false, Hostname:"algonquin", Flush Interval:10s

如果Telegraf是"不活动的",请按以下步骤启动它:

$ sudo systemctl start telegraf

检查上面的状态,并检查系统日志,以确保没有与InfluxDB的连接错误.

 $ sudo journalctl -f -n 128 -u telegraf
-- Logs begin at Pá 2017-09-01 09:59:06 CEST. --
zář 01 15:15:42 algonquin systemd[1]: Started The plugin-driven server agent for reporting metrics into InfluxDB.
zář 01 15:15:43 algonquin telegraf[16968]: 2017-09-01T13:15:43Z I! Starting Telegraf (version 1.3.3)
zář 01 15:15:43 algonquin telegraf[16968]: 2017-09-01T13:15:43Z I! Loaded outputs: influxdb
zář 01 15:15:43 algonquin telegraf[16968]: 2017-09-01T13:15:43Z I! Loaded inputs: inputs.disk inputs.diskio inputs.kernel inputs.mem inputs.processes inputs.swap inputs.system inputs.cpu
zář 01 15:15:43 algonquin telegraf[16968]: 2017-09-01T13:15:43Z I! Tags enabled: host=algonquin
zář 01 15:15:43 algonquin telegraf[16968]: 2017-09-01T13:15:43Z I! Agent Config: Interval:10s, Quiet:false, Hostname:"algonquin", Flush Interval:10s

InfluxDB和Telegraf现在正在本地主机上运行并在监听. 等待大约一分钟,以使Telegraf向InfluxDB提供少量系统指标数据. 然后,确认InfluxDB具有Kapacitor将使用的数据.

这可以通过以下查询来实现:

$ curl -G 'http://localhost:8086/query?db=telegraf' --data-urlencode 'q=SELECT mean(usage_idle) FROM cpu'

这将返回类似于以下示例的结果.

示例-InfluxDB REST查询的结果

{"results":[{"statement_id":0,"series":[{"name":"cpu","columns":["time","mean"],"values":[["1970-01-01T00:00:00Z",91.82304336748372]]}]}]}

Installing and starting Kapacitor

如果可用, 使用Linux系统软件包( .deb.rpm )安装Kapacitor .

默认的Kapacitor配置文件解压缩到/etc/kapacitor/kapacitor.conf . 可以从Kapacitor守护程序中提取当前配置的副本,如下所示:

kapacitord config > kapacitor.conf

该配置是toml文件,与InfluxDB配置非常相似. 这是因为可以为InfluxDB配置的任何输入也可以用于Kapacitor.

启动Kapacitor服务:

$ sudo systemctl start kapacitor

验证Kapacitor服务的状态:

$ sudo systemctl status kapacitor
● kapacitor.service - Time series data processing engine.
   Loaded: loaded (/lib/systemd/system/kapacitor.service; enabled; vendor preset: enabled)
   Active: active (running) since Pá 2017-09-01 15:34:16 CEST; 3s ago
     Docs: https://github.com/influxdb/kapacitor
 Main PID: 18526 (kapacitord)
    Tasks: 13
   Memory: 9.3M
      CPU: 122ms
   CGroup: /system.slice/kapacitor.service
           └─18526 /usr/bin/kapacitord -config /etc/kapacitor/kapacitor.conf

zář 01 15:34:16 algonquin systemd[1]: Started Time series data processing engine..
zář 01 15:34:16 algonquin kapacitord[18526]: '##:::'##::::'###::::'########:::::'###:::::'######::'####:'########::'#######::'########::
zář 01 15:34:16 algonquin kapacitord[18526]:  ##::'##::::'## ##::: ##.... ##:::'## ##:::'##... ##:. ##::... ##..::'##.... ##: ##.... ##:
zář 01 15:34:16 algonquin kapacitord[18526]:  ##:'##::::'##:. ##:: ##:::: ##::'##:. ##:: ##:::..::: ##::::: ##:::: ##:::: ##: ##:::: ##:
zář 01 15:34:16 algonquin kapacitord[18526]:  #####::::'##:::. ##: ########::'##:::. ##: ##:::::::: ##::::: ##:::: ##:::: ##: ########::
zář 01 15:34:16 algonquin kapacitord[18526]:  ##. ##::: #########: ##.....::: #########: ##:::::::: ##::::: ##:::: ##:::: ##: ##.. ##:::
zář 01 15:34:16 algonquin kapacitord[18526]:  ##:. ##:: ##.... ##: ##:::::::: ##.... ##: ##::: ##:: ##::::: ##:::: ##:::: ##: ##::. ##::
zář 01 15:34:16 algonquin kapacitord[18526]:  ##::. ##: ##:::: ##: ##:::::::: ##:::: ##:. ######::'####:::: ##::::. #######:: ##:::. ##:
zář 01 15:34:16 algonquin kapacitord[18526]: ..::::..::..:::::..::..:::::::::..:::::..:::......:::....:::::..::::::.......:::..:::::..::
zář 01 15:34:16 algonquin kapacitord[18526]: 2017/09/01 15:34:16 Using configuration at: /etc/kapacitor/kapacitor.conf

由于InfluxDB在http://localhost:8086上运行,因此Kapacitor在启动期间会找到它,并在InfluxDB上创建多个订阅 . 这些订阅告诉InfluxDB将接收到的所有数据发送到Kapacitor.

有关更多日志数据,请查看传统的/var/log/kapacitor目录中的日志文件.

$ sudo tail -f -n 128 /var/log/kapacitor/kapacitor.log
[run] 2017/09/01 15:34:16 I! Kapacitor starting, version 1.3.1, branch master, commit 3b5512f7276483326577907803167e4bb213c613
[run] 2017/09/01 15:34:16 I! Go version go1.7.5
[srv] 2017/09/01 15:34:16 I! Kapacitor hostname: localhost
[srv] 2017/09/01 15:34:16 I! ClusterID: e181c0c9-f173-42b5-92c7-10878c15887b ServerID: b0a73d8a-dae8-473c-a053-c06fcaacae7d
[task_master:main] 2017/09/01 15:34:16 I! opened
[scrapers] 2017/09/01 15:34:17 I! [Starting target manager...]
[httpd] 2017/09/01 15:34:17 I! Starting HTTP service
[httpd] 2017/09/01 15:34:17 I! Authentication enabled: false
[httpd] 2017/09/01 15:34:17 I! Listening on HTTP: [::]:9092
[run] 2017/09/01 15:34:17 I! Listening for signals
[httpd] 127.0.0.1 - - [01/Sep/2017:15:34:20 +0200] "POST /write?consistency=&db=_internal&precision=ns&rp=monitor HTTP/1.1" 204 0 "-" "InfluxDBClient" 422971ab-8f1a-11e7-8001-000000000000 1373
[httpd] 127.0.0.1 - - [01/Sep/2017:15:34:20 +0200] "POST /write?consistency=&db=telegraf&precision=ns&rp=autogen HTTP/1.1" 204 0 "-" "InfluxDBClient" 42572567-8f1a-11e7-8002-000000000000 336
...

在这里可以看到一些基本的启动消息:在HTTP端口上侦听并将数据发布到InfluxDB. 此时,InfluxDB正在将从Telegraf接收的数据流式传输到Kapacitor.

Kapacitor tasks

Kapacitor task定义要对一组数据进行的工作. 有两种类型的任务: streambatch .

stream任务将所有从InfluxDB写入Kapacitor的数据镜像. 这样可以将查询开销从InfluxDB转移到Kapacitor,但是需要Kapacitor将数据存储在磁盘上.

batch任务按设置的时间间隔从InfluxDB查询数据,并在查询数据时对其进行处理.

Kapacitor任务使用TICKscript语法定义数据处理管道. 任务文件通常称为" TICKscripts".

Task execution

在每个TICKscript的开头,您可以使用dbrp关键字指定数据库和保留策略,其中包含TICKscript应该对其执行操作的dbrp .

dbrp "telegraf"."autogen"

// ...

当Kapacitor从数据库和保留策略中接收到与指定数据相匹配的数据时,它将执行TICKscript.

您只能根据数据库和保留策略执行Kapacitor任务. Kapacitor不支持基于其他条件的任务执行.

Triggering alerts from stream data

现在已设置TICKStack(不包括Chronograf,此处未介绍). 现在,本指南将介绍与Kapacitor实际合作的基础知识.

那么应该指导Kapacitor做什么呢?

Kapacitor最常见的用例是触发警报. 以下示例将设置有关高CPU使用率的警报. 如何定义高CPU使用率? Telegraf将Cpu指标写入InfluxDB,该指标是CPU在空闲状态下花费的时间百分比. 出于演示目的,假设当空闲使用率降至70%以下时,应触发严重警报.

现在可以编写一个Tickscript来满足这些条件. 将下面的脚本复制到一个名为cpu_alert.tick的文件中:

dbrp "telegraf"."autogen"

stream
    // Select just the cpu measurement from our example database.
    |from()
        .measurement('cpu')
    |alert()
        .crit(lambda: int("usage_idle") <  70)
        // Whenever we get an alert write it to a file.
        .log('/tmp/alerts.log')

Kapacitor具有一个HTTP API,通过它可以进行所有通信. kapacitor客户端应用程序通过命令行公开API. 现在,使用此CLI工具来定义task和可以访问的数据库(包括保留策略):

kapacitor define cpu_alert -tick cpu_alert.tick

关于声明数据库和保留策略的注意事项:从Kapacitor 1.4开始,可以使用脚本中的可选语句声明要应用TICKscript的数据库和保留策略:例如dbrp "telegraf"."autogen" . 如果未在脚本中声明,则必须在使用kapacitor标志-dbrp后跟参数" <DBNAME>"." <RETENTION_POLICY>"定义任务时对其进行定义.

验证是否已使用list命令创建警报.

$ kapacitor list tasks
ID        Type      Status    Executing Databases and Retention Policies
cpu_alert stream    disabled  false     ["telegraf"."autogen"]

使用show命令查看有关任务的详细信息.

$ kapacitor show cpu_alert
ID: cpu_alert
Error:
Template:
Type: stream
Status: disabled
Executing: false
...

该命令将在下面更详细地介绍.

Kapacitor现在知道如何触发警报.

但是,在启用任务之前,什么也不会发生. 在启用该任务之前,应首先测试该任务,以确保该任务不会向带有警报的日志文件或通信通道发送垃圾邮件. 记录一下当前数据流,并使用它来测试新任务:

kapacitor record stream -task cpu_alert -duration 60s

由于该任务是使用数据库和保留策略对定义的,因此记录知道仅记录来自该数据库和保留策略的数据.

  • 注意–对连接被拒绝进行故障排除–如果在运行record命令时返回类型为getsockopt: connection refused的错误getsockopt: connection refused (Linux)或connectex: No connection could be made... (Windows),请确保Kapacitor服务为运行. 请参阅上面的" 安装和启动Kapacitor"部分 . 如果启动了Kapacitor并且仍然遇到此错误,请检查主机的防火墙设置,并确保可访问端口9092 . 还要检查/var/log/kapacitor/kapacitor.log的消息. http/etc/kapacitor/kapacitor.conf其他配置可能有问题,这将出现在日志中. 如果Kapacitor服务在另一台主机上运行,​​请将本地外壳程序中的KAPACITOR_URL环境变量设置为远程计算机上的Kapacitor端点.

现在,获取返回的ID并将其放在bash变量中,以便以后使用(返回的实际UUID将有所不同):

rid=cd158f21-02e6-405c-8527-261ae6f26153

确认记录捕获了一些数据. 跑

kapacitor list recordings $rid

输出应如下所示:

ID                                      Type    Status    Size      Date
cd158f21-02e6-405c-8527-261ae6f26153    stream  finished  2.2 kB    04 May 16 11:44 MDT

As long as the size is more than a few bytes it is certain that some data was captured. If Kapacitor is not receiving data yet, check each layer: Telegraf → InfluxDB → Kapacitor. Telegraf will log errors if it cannot communicate to InfluxDB. InfluxDB will log an error about connection refused if it cannot send data to Kapacitor. Run the query SHOW SUBSCRIPTIONS to find the endpoint that InfluxDB is using to send data to Kapacitor.

$ curl -G 'http://localhost:8086/query?db=telegraf' --data-urlencode 'q=SHOW SUBSCRIPTIONS'

{"results":[{"statement_id":0,"series":[{"name":"_internal","columns":["retention_policy","name","mode","destinations"],"values":[["monitor","kapacitor-ef3b3f9d-0997-4c0b-b1b6-5d0fb37fe509","ANY",["http://localhost:9092"]]]},{"name":"telegraf","columns":["retention_policy","name","mode","destinations"],"values":[["autogen","kapacitor-ef3b3f9d-0997-4c0b-b1b6-5d0fb37fe509","ANY",["http://localhost:9092"]]]}]}]}

利用从流中记录的数据快照,可以将该数据重播到新任务. replay操作仅将数据replay到特定任务. 这样,可以完全隔离地测试任务:

kapacitor replay -recording $rid -task cpu_alert

由于已经记录了数据,因此可以尽快重放,而不必等待实时通过. 设置标志-real-clock ,将通过等待时间戳之间的增量来重播数据,尽管无论实时与否,结果都是相同的. 这是因为时间是由每个节点上接收到的数据点度量的.

使用以下命令检查日志.

sudo cat /tmp/alerts.log

是否收到任何警报? 该文件应包含JSON行,其中每一行代表一个警报. JSON行包含警报级别和触发警报的数据.

取决于主机的繁忙程度,也许不是.

可以将任务修改为非常敏感,以确保警报正常运行. 在TICKscript中,将lamda函数.crit(lambda: "usage_idle" < 70)更改为.crit(lambda: "usage_idle" < 100) ,然后再次定义任务.

每当您要更新任务时,请更改TICKscript,然后仅使用TASK_NAME-tick参数再次运行define命令:

现在,在录制过程中收到的每个数据点都会触发警报.

kapacitor define cpu_alert -tick cpu_alert.tick

再次重播并验证结果.

kapacitor replay -recording $rid -task cpu_alert

一旦alerts.log结果验证它是否工作,改变usage_idle阈回到更合理的水平并且再次重新定义任务使用define如上图命令.

启用任务,以便它可以使用以下命令开始处理实时数据流:

kapacitor enable cpu_alert

现在,警报将实时写入日志.

To see that the task is receiving data and behaving as expected run the show command once again to get more information about it:

$ kapacitor show cpu_alert
|from()
ID: cpu_alert
Error:
Type: stream
Status: Enabled
Executing: true
Created: 04 May 16 21:01 MDT
Modified: 04 May 16 21:04 MDT
LastEnabled: 04 May 16 21:03 MDT
Databases Retention Policies: [""."autogen"]
TICKscript:
stream
    // Select just the cpu me
        .measurement('cpu')
    |alert()
        .crit(lambda: "usage_idle" <  70)
        // Whenever we get an alert write it to a file.
        .log('/tmp/alerts.log')

DOT:
digraph asdf {
graph [throughput="0.00 points/s"];

stream0 [avg_exec_time_ns="0" ];
stream0 -> from1 [processed="12"];

from1 [avg_exec_time_ns="0" ];
from1 -> alert2 [processed="12"];

alert2 [alerts_triggered="0" avg_exec_time_ns="0" ];
}

第一部分提供有关任务状态及其可能遇到的任何错误的信息. TICKscript部分显示Kapacitor已存储在其本地数据库中的TICKscript版本.

最后一部分DOT是一个graphviz点格式的树,其中包含有关TICKscript定义的数据处理管道的信息. 它的成员是键值关联数组条目,其中包含有关每个节点的统计信息,并且沿着边缘到下一个节点的链接也包括关联数组统计信息. 链接/边缘成员中的已处理键指示沿图的指定边缘传递的数据点的数量. 例如,在上述stream0节点(又名stream从TICKscript VAR)已经发送了12分至from1节点. 在from1节点也到发送12分alert2节点. 由于Telegraf被配置为发送cpu数据,因此所有12个点都匹配from1节点的from /测量标准,并继续传递.

注意:在Debian或RedHat上安装graphviz(如果尚未安装)时,请使用操作系统提供程序提供的软件包. graphviz网站的下载部分中提供的软件包不是最新的.

现在任务正在使用实时数据运行,这是一个快速的技巧,可以使用一个内核的100%生成一些人工cpu活动:

while true; do i=0; done

有很多方法可以获取阈值警报. 那么,为什么所有这些管道TICKscript的东西呢? 总之,因为TICKscripts可以迅速扩展,成为强大.

Gotcha - single versus double quotes

TICKscripts中的单引号和双引号有非常不同的作用:

请注意以下示例:

var data = stream
    |from()
        .database('telegraf')
        .retentionPolicy('autogen')
        .measurement('cpu')
        // NOTE: Double quotes on server1
        .where(lambda: "host" == "server1")

该搜索的结果将始终为空,因为在" server1"周围使用了双引号. 这意味着Kapacitor将搜索"主机"字段等于"服务器1" 字段中保存的值的序列. 这可能不是预期的. 更有可能是要搜索标签" host"具有 " server1"的系列,因此应使用单引号. 双引号表示数据字段,单引号表示字符串值. 为了匹配value ,上面的tick脚本应如下所示:

var data = stream
    |from()
        .database('telegraf')
        .retentionPolicy('autogen')
        .measurement('cpu')
        // NOTE: Single quotes on server1
        .where(lambda: "host" == 'server1')

Extending TICKscripts

下面的TICKscript将计算运行平均值并比较当前值. 然后,如果值与平均值之间的差超过3个标准偏差,它将触发警报. 将cpu_alert.tick脚本替换为下面的TICKscript:

stream
    |from()
        .measurement('cpu')
    |alert()
        // Compare values to running mean and standard deviation
        .crit(lambda: sigma("usage_idle") > 3)
        .log('/tmp/alerts.log')

就像这样,可以创建一个动态阈值,如果cpu的使用量在白天下降或在夜间高峰,则将发出警报. 试试看. 使用define更新任务TICKscript.

kapacitor define cpu_alert -tick cpu_alert.tick

注意:如果已启用任务,则使用define命令重新定义任务将自动reload它. 要定义任务而不重载,请使用-no-reload

现在尾随警报日志:

sudo tail -f /tmp/alerts.log

暂时不应有任何警报触发. 接下来,启动一个while循环以添加一些负载:

while true; do i=0; done

一旦创建了足够的人工负载,便应立即将警报触发器写入日志. 让循环运行几分钟. 取消循环后,应发出另一个警报,指示CPU使用率再次更改. 使用此技术,可以针对CPU使用率的上升沿和下降沿以及任何异常值生成警报.

A real world example

现在已经涵盖了基础知识,这是一个更真实的示例. 一旦来自多个主机的指标流式传输到Kapacitor,就可以执行以下操作:汇总并分组每个数据中心中运行的每个服务的CPU使用率,然后基于第95个百分位触发警报. 除了仅将警报写入日志外,Kapacitor还可以与第三方实用程序集成:目前支持Slack,PagerDuty,HipChat,VictorOps等. 该警报还可以通过电子邮件发送,发布到自定义端点或可以触发自定义脚本的执行. 还可以定义自定义消息格式,以使警报具有正确的上下文和含义. TICKscript看起来像下面的例子.

示例-多个服务cpus上的流的TICKscript以及第95个百分位数的警报

stream
    |from()
        .measurement('cpu')
    // create a new field called 'used' which inverts the idle cpu.
    |eval(lambda: 100.0 - "usage_idle")
        .as('used')
    |groupBy('service', 'datacenter')
    |window()
        .period(1m)
        .every(1m)
    // calculate the 95th percentile of the used cpu.
    |percentile('used', 95.0)
    |eval(lambda: sigma("percentile"))
        .as('sigma')
        .keep('percentile', 'sigma')
    |alert()
        .id('{{ .Name }}/{{ index .Tags "service" }}/{{ index .Tags "datacenter"}}')
        .message('{{ .ID }} is {{ .Level }} cpu-95th:{{ index .Fields "percentile" }}')
        // Compare values to running mean and standard deviation
        .warn(lambda: "sigma" > 2.5)
        .crit(lambda: "sigma" > 3.0)
        .log('/tmp/alerts.log')

        // Post data to custom endpoint
        .post('https://alerthandler.example.com')

        // Execute custom alert handler script
        .exec('/bin/custom_alert_handler.sh')

        // Send alerts to slack
        .slack()
        .channel('#alerts')

        // Sends alerts to PagerDuty
        .pagerDuty()

        // Send alerts to VictorOps
        .victorOps()
        .routingKey('team_rocket')

定义警报之类的简单操作可以迅速扩展到更大的范围. 使用上述脚本,如果任何数据中心中的任何服务偏离正常行为的3个以上标准偏差(由CPU使用历史的第95个百分位数定义),就会触发警报,警报将在1分钟内发出!

有关警报如何工作的更多信息,请参阅AlertNode文档.

Triggering alerts from batch data

Kapacitor不仅可以处理流中的数据,还可以定期查询InfluxDB,然后批量处理该数据. 虽然根据cpu的使用量触发警报更适合流情况,但此处通过遵循相同的用例展示了batch任务如何工作的基本思想.

此TICKscript的功能与早期的流任务大致相同,但作为批处理任务:

dbrp "telegraf"."autogen"

batch
    |query('''
        SELECT mean(usage_idle)
        FROM "telegraf"."autogen"."cpu"
    ''')
        .period(5m)
        .every(5m)
        .groupBy(time(1m), 'cpu')
    |alert()
        .crit(lambda: "mean" < 70)
        .log('/tmp/batch_alerts.log')

将上面的脚本复制到文件batch_cpu_alert.tick .

定义此任务:

kapacitor define batch_cpu_alert -tick batch_cpu_alert.tick

验证其创建:

$ kapacitor list tasks
ID              Type      Status    Executing Databases and Retention Policies
batch_cpu_alert batch     disabled  false     ["telegraf"."autogen"]
cpu_alert       stream    enabled   true      ["telegraf"."autogen"]

可以像这样记录任务中的查询结果(同样,实际的UUID会有所不同):

kapacitor record batch -task batch_cpu_alert -past 20m
# Save the id again
rid=b82d4034-7d5c-4d59-a252-16604f902832

这将使用batch_cpu_alert任务中的查询记录最后20分钟的批处理. 在这种情况下,由于period为5分钟,因此最后4批将保存在记录中.

批记录可以用相同的方式重放:

kapacitor replay -recording $rid -task batch_cpu_alert

检查警报日志以确保警报按预期生成. 上面基于sigma的警报也可以适用于批处理数据. 在Kapacitor中试玩并熟悉更新,测试和运行任务.

Loading Tasks with the Kapacitor daemon

也可以节省TICKscripts在声明的装载目录kapacitor.conf . 这样,可以在启动时使用Kapacitor守护程序直接加载和启用任务和任务模板. 此类脚本必须包括数据库和保留策略声明dbrp .

有关更多信息,请参见" 加载目录"指南.

What’s next?

查看有关如何使用Kapacitor的示例指南 . 此处展示的用例探索了Kapacitor的一些更丰富的功能.

本文档是开源的 . 看到错字了吗? 请打开一个问题 .


需要启动和运行的帮助吗? Get Support

by  ICOPY.SITE