kapacitor脚本tick针对bool类型的处理

7 篇文章 0 订阅
6 篇文章 0 订阅

目录

stream类型的tick脚本

bool()函数

正确的做法

最终完整的tick脚本(batch)


telegraf采集k8s endpoint metric的时候会存一些bool类型的值到influxdb里面。

如判断endpoint是否ready,就是bool类型。

直接使用influxql查询是没问题的。

 

stream类型的tick脚本

pod_alert.tick

stream
   |from()
      .measurement('kubernetes_endpoint')
      .where(lambda: "namespace" == 'ctg')
  |window()
      .period(10m)
      .every(1s)
  |alert()
       .id('stream pod not ready alerting')
       .message('type: pod | {{ .Level}}: pod is not ready ')
       .warn(lambda: "ready" == false)
       .log('/root/pod_alerts.log')
       .email('xxx@qq.com')
kapacitor define pod_unready -type "stream" -dbrp "telegraf"."autogen" -tick pod_alert.tick 

 报错

invalid TICKscript: name "false" is undefined. Names in scope: time,stream

bool()函数

https://docs.influxdata.com/kapacitor/v1.5/tick/expr/#stateless-functions

对于int类型: 

     bool(0) 对应false

     bool(1) 对应true

对于string类型:

    '0', 'f','F', 'false', 'FALSE','False',  对应false

    '1', 't', 'T', 'true', 'TRUE', 'True' , 对应true

   bool() 函数的参数如果是tring类型,只能是单引号,不可用双引号,否则报错 :

Cannot call function \"bool\" argument \"0\" is missing, values in scope are [\"ready\"]

后来把stream修改为了batch,生效了 。

正确的做法

   把bool值使用bool()方法进行转换。

    lambda:  "ready" == bool(0)  或者lambda: "ready" == bool('0')

bool(value) bool
调用的是golang 的strconv.ParseBool()方法,源码如下:

package strconv

// ParseBool returns the boolean value represented by the string.
// It accepts 1, t, T, TRUE, true, True, 0, f, F, FALSE, false, False.
// Any other value returns an error.
func ParseBool(str string) (bool, error) {
	switch str {
	case "1", "t", "T", "true", "TRUE", "True":
		return true, nil
	case "0", "f", "F", "false", "FALSE", "False":
		return false, nil
	}
	return false, syntaxError("ParseBool", str)
}

 

 

最终完整的tick脚本(batch)

类型batch

batch
   |query('''SELECT * FROM "telegraf"."autogen"."kubernetes_endpoint" WHERE "namespace"='ctg' ''')
      .period(1m)
      .every(1s)
   |alert()
      .message('{{ .Level}}:{{ index .Fields "pod"}} is  unready, pls check.
              host: {{ index .Fields "host"}}, node name: {{ index .Fields "node_name"}}')
      .warn(lambda: "ready" == bool('0'))
      .log('/root/pod_alerts.log')
      .email('xxx@qq.com')

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中的原子bool类型是一种特殊的类型,它提供了一种线程安全的方式来处理bool值。原子bool类型使用Qt的线程库提供的功能,确保多个线程同时访问bool值时不会发生数据竞争。 原子bool类型通常用于需要多个线程同时修改同一bool变量的场景,例如条件变量、信号与槽机制等。当多个线程同时访问原子bool变量时,它们将通过互斥锁(mutex)或原子操作来确保对变量的访问是原子的,即一次只有一个线程能够修改该变量。 原子bool类型提供了几个有用的成员函数,用于在多个线程之间同步对bool变量的访问。例如,可以使用`load()`函数获取当前bool变量的值,使用`store()`函数设置新的bool值,使用`testAndSetRelaxed()`函数进行原子交换操作等。这些函数都使用了Qt的线程库提供的同步机制,以确保线程安全。 使用原子bool类型的好处是,它能够避免多个线程同时修改同一bool变量时可能出现的竞争条件,从而提高程序的性能和可靠性。然而,需要注意的是,虽然原子bool类型提供了线程安全,但它并不能完全消除所有竞争条件的风险。在某些情况下,仍然需要额外的同步机制来确保数据的一致性。 总之,Qt中的原子bool类型是一种特殊的bool类型,它提供了一种线程安全的方式来处理bool值,适用于需要多个线程同时访问同一变量的场景。它使用Qt的线程库提供的同步机制来确保数据的安全性和一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值