- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
夜莺 v8 大版本已经启动开发,预计 25 年 7、8 月份发正式版,相比 v7 大概会做四五个大功能,每个功能做完了做稳定了都会提前放出来供大家体验,虽然以 beta 来命名,实际是稳定的,大家可以放心升级.
夜莺 v5 v6 v7 三个大版本算是一脉相承,一直在打基础,最后一个稳定版是 v7.7.2,可以看作是这个系列的终极版。其实这个系列中有些功能早就想改进了,但是由于兼容性、迁移成本、人力的考虑,一直没有动作。现在基础打好了,从 v8 开始,我们计划开始做一些有意思的功能。当然,也不会完全不兼容 v7,v7 用户还是可以直接升级的,只是我们会通过 feature flag 等方式,在某些功能上引入一些新的做法.
v8 重点想做的事情如下:
当然,还会有很多其他小改动计划,这里就不一一列举了。这两天发了 v8.0.0-beta.1 版本,已经完成了一些有意思的功能。下面给大家介绍一下.
v8.0.0-beta.1 版本中,我们引入了 sqlite 和 miniredis,不再依赖 mysql、redis,这样就可以用一个二进制一键拉起了,测试时就方便多了。不过这种方式仅适合个人功能测试,还不能用于生产环境。生产环境还是需要 mysql、redis 的.
下面我来演示一下如何一键拉起 v8.0.0-beta.1 版本.
到如下地址下载 v8.0.0-beta.1 版本的发布包:https://flashcat.cloud/download/nightingale/ 。
我本地有一个 arm64 的 linux 虚机来做测试,所以下载了 arm64 版本的发布包 n9e-v8.0.0-beta.1-linux-arm64.tar.gz。解包之后直接运行夜莺的二进制即可。操作如下:
wget https://download.flashcat.cloud/n9e-v8.0.0-beta.1-linux-arm64.tar.gz
mkdir n9e-v8.0.0-beta.1-linux-arm64
tar zxvf n9e-v8.0.0-beta.1-linux-arm64.tar.gz -C n9e-v8.0.0-beta.1-linux-arm64
cd n9e-v8.0.0-beta.1-linux-arm64
./n9e
哦了。超级简单。接下来可以在夜莺的页面上接入数据源,类似 Grafana,然后即可对数据源的数据做告警、查询分析等.
如果你想采集监控数据,选择就比较多了,比如:
这是一个重大的改造。想解决特殊机器的阈值配置问题。举个例子,假设 DBA 团队有 100 台机器,默认情况下,希望 cpu_usage_idle < 20 告警,但是有几台机器比较特殊,CPU 核数较多,希望 cpu_usage_idle < 15 才告警。此时应该如何解决?
原本在 Prometheus 生态中,一切皆标签,故而我们可以把这几台机器打上特殊标签表示这几台机器配置高,比如打上 hardware=high 的标签,然后其他普通机器打上 hardware=normal 的标签。然后配置两条告警规则:
cpu_usage_idle{hardware="normal"} < 20
cpu_usage_idle{hardware="high"} < 15
看起来可以解决,实际会有如下一些问题:
hardware=high
感觉尚可接受,但是普通机器较多,每次新机器启用都要打上 hardware="normal" 标签,着实有点烦再举一个例子。假设现在有部分机器有混部的情况。比如同时部署了 redis 和 etcd 服务。etcd 的服务对硬盘 IO 比较敏感,所以想配置一个 IO 使用率超过 80% 就告警的规则,你可能会这么想:
diskio_util{service="etcd"} > 80
然后其他的服务所在机器的大于 90% 才告警,于是:
diskio_util{service!="etcd"} > 90
对于混部有 etcd 和 redis 的机器,希望同时打上 service="etcd" 和 service="redis" 的标签。但是很遗憾,Prometheus 生态里不允许出现这种同 Key 不同 Value 的做法。这就非常棘手了,相当于没法使用标签体系来描述混部的场景.
怎么搞?
夜莺从 v7.4.1 开始,支持把机器挂载到多个业务组,其实就相当于可以用业务组来描述现实中的混部的场景。当然,对于刚提到的硬件不同规格的场景,也可以用业务组来描述,业务组很灵活,想怎么划分就怎么划分.
但是,仅仅把机器挂到不同的业务组,只是方便我们去分类查看,和告警规则并没有联动。告警规则强依赖 promql,而 promql 还是需要使用标签来做过滤。从 v8.0.0.-beta.1 开始,我们提供了一个新的手段.
即,在告警规则的 promql 中支持配置变量,变量类型可以设置为机器,然后告警规则中也支持配置机器的筛选方式(支持通过机器名或业务组来筛选),于是就可以让告警规则和业务组联动起来。这么说可能比较抽象。下面举个例子.
告警规则中增加了一个 switch 开关:启用变量。如果你启用了变量就会出现一堆比较复杂的配置.
在上例中,我定义了两个变量,一个是 host,类型是机器标识,默认值是所有机器,另一个是 threshold,类型是阈值,默认值是 30。然后我在 promql 中引用了这两个变量。如果没有下面的变量筛选部分,仅有变量配置 + promql 的话,告警引擎的行为是:
拿到 host 变量的所有值,即全部机器,假设是 100 台,然后就是 for 循环 100 次,每次把 promql 中的 $host $threshold 变量替换掉,执行检测,看这个最终的 promql 是否查到了数据,如果查到了数据并满足持续时长的配置,就产生告警.
而我上例中还配置了变量筛选以及一个子筛选。最终的效果就是:
promql 中那个下划波浪线先不用关心,并非是你的 promql 写的不对,而是这个编辑器自身的问题.
建议:如果可以按照之前的普通 promql 就可以解决的告警场景,建议继续使用老方式,如果老方式实在不好解决,可以尝试这种启用变量的告警规则,这个方式和业务组联动,性能会稍差,但是灵活性更好。另外业务组是夜莺的特有的东西,所以一旦你这么用了,就和夜莺深度绑定了,将来如果想迁移到其他告警引擎也会麻烦一些,这点也请注意.
关于这个告警规则启用变量的更多信息,可以参考 文档.
有些公司的网络环境比较复杂,可能会有代理的需求。夜莺的 webhook 一直不支持代理,如果夜莺的机器不通外网,发钉钉、企微等就没法搞了,虽说可以走自定义通知脚本的方式,但是就比较麻烦.
实际从 v7.7.2 开始就支持了代理模式,不过一直没宣传,借由 v8.0.0-beta.1 版本的发布,做一下周知.
比如你希望通过代理调用钉钉和企微,可以配置三个环境变量,HTTP_PROXY、HTTPS_PROXY、N9E_PROXY_URL,前面两个环境变量指定代理地址,N9E_PROXY_URL 指定要被代理的 URL,比如:
N9E_PROXY_URL=qyapi.weixin.qq.com,oapi.dingtalk.com
多个 URL 用逗号分隔,每个 URL 不用写全,只写一部分就行,能匹配到就行,就像上面,我只写了域名,没有把整个回调地址写上.
v8.0.0-beta.1 还有一些其他改动,比如告警规则支持 Cron 表达式配置执行周期,可灵活设置定时执行策略,更多改动请参考 Changelog.
一个新的大版本启程了,兄弟们跟上脚步,一起打造最好用的国产开源监控系统。如果你有什么建议,欢迎在 https://github.com/ccfos/nightingale 上提 issue,如果能来个 star 就更好了,让更多人知道并参与,即便现在还有瑕疵也会越来越好.
最后此篇关于夜莺v8第一个版本来了,开始做有意思的功能了的文章就讲到这里了,如果你想了解更多关于夜莺v8第一个版本来了,开始做有意思的功能了的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个 k*n矩阵 X 和 k*k矩阵A。对于X的每一列,我想计算标量 X[:, i].T.dot(A).dot(X[:, i]) (或者,数学上, Xi' * A * Xi )。 目前,我有一个
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是 VueJS 的新手。我已经使用 vuetify/webpack-ssr 模板创建了一个项目,现在我想创建一个登录页面,但是没有显示表单,控制台给了我以下信息: [Vue warn]: Unkno
我尝试将 value 插入到 C++ vector v 之前的第 i 元素(或元素 (i-1) 之后) )。代码很简单 v.insert(v.begin() + i, value); 我确信当 i 介
我需要显示使用合并排序算法排序的 vector 。然而,当我使用 v.begin() 时,我的 friend 使用 v.data() 来传递 vector 。他的代码运行良好,而我的却不行。请解释。
这是我的命令(url1、url2、url3、url4 是占位符): ffmpeg -i url1 -i url2 -i url3 -i url4 -filter_complex “[1:v:0] [1
我以前用过Vue,我知道怎么用v-for渲染元素序列,v-if或v-show有条件地显示元素,并且 v-model例如,控制段落的内容。 但现在我需要对 DOM 进行更精细的控制: 我有一个range
我正在学习所有权和借用。 borrow1 和borrow2 的区别在于在borrow2 打印时使用了&: fn borrow1(v: &Vec) { println!("{}", &v[10]
我找不到一种方法来选择不同的选项来渲染 v-for 中的文本。是否有可能或者我是否需要以不同的方式构建逻辑来执行类似于下面的代码的操作? // i
Iterable 的三个直接子类型是 Map , Seq , 和 Set .除了性能问题之外,似乎还有一个 Seq是从整数到值的映射,以及 Set是从值到 bool 值的映射(如果值在集合中,则为 t
我想应用一个计算方法,如果键存在则增加值,否则将 1。有 Map map = new HashMap<>(); 我不明白为什么 for (int i = 0; i v != null ? v++ :
标准(IEEE 754/C)是否保证以下代码断言永远不会失败? int main() { for ( /* all possible float / double values */ )
代码由Vue语言编写,使用Element-ui框架, 如果一个对象包含某些内容,则会显示该内容,如果不包含则禁用菜单按钮。 输出应该是这样的: a、b(禁用)、c、d、e 但我的是这样的: a、a(禁
如果我这样做: {{ morevalue }} {{ value }} v-else 中的跨度也会在第二个 V-FOR 上循环,即使它上面没有任何 v-for,为什么? 这是
如果我这样做: {{ morevalue }} {{ value }} v-else 中的跨度也会在第二个 V-FOR 上循环,即使它上面没有任何 v-for,为什么? 这是
我将 Vue.js 与 Vuetify 一起使用,我正在尝试使用 v-data-table 从后端加载菜单列表并使用 对其设置一些权限v-switches 但我在尝试 v-model 数组时遇到问题:
我在 Java 的流式操作中努力维护我想要的数据结构,这很可能是由于缺乏正确的理解和实践。 public class Main { public static void main(String
我正在尝试为匹配中的每个匹配呈现一些 HTML,但是,我不太确定 实际上是正确的。 更具体地说,我不确定我是否可以使用 v-bind:match='match'在与循环相同的元素上 v-for='ma
所以我想知道为什么这个 v-if 和 v-else 语句不起作用,为什么我要以不同的方式解决它。 代码如下 Required: Select a Workflow {{ isChain ?
我有一个 VueJS 组件 ,我在同一个模板中使用了两次来显示两组不同的数据。每个都显示在自己的 使用 v-if 切换的容器在导航选项卡上。 似乎这些组件被实例化为同一个实例。我调用 console
我是一名优秀的程序员,十分优秀!